将一个对象方法的地址传给另一个对象,让它调用。

问题描述 投票:0回答:2

你好,我是C++的,我想把一个对象的方法传给同一类的另一个对象。

class Object{
public:
    int id;
    int newId;
    Object(int _id){
       id = _id;
    };
    int (*function)();
    int someFunction(){
       return id*2;
    };
    void updateFunction(){
       newId = function();
    }
};

int someOtherFuntion(){
   return 3;
}

int main(){

    Object* obj[2];
    obj[0] = new Object(1);
    obj[1] = new Object(2);
    //next line is where the error happens
    obj[0]->function = &obj[1]->someFunction;
    obj[1]->function = &someOtherFuntion;

    for(int i = 0; i<2; i++){
       obj[i]->updateFunction();
    }
    return 1;
}

稍后,我想用一个循环循环所有对象,并调用相应的函数,有时是对象方法,有时是普通函数。

这样会返回错误。ISO C++禁止取一个绑定的成员函数的地址来形成一个成员函数的指针。 说'&Object::someFunction' [-fpermissive] 。

c++ class pointers methods
2个回答
1
投票

没有办法用函数指针做你想做的事情,因为方法不能分配给函数指针。但是你可以用 std::function 它比函数指针灵活得多,并且具有一个 兰姆达函数 将你的方法绑定到一个特定的对象上。

#include <functional>

class Object{
public:
    int id;
    int newId;
    Object(int _id){
       id = _id;
    };
    std::function<int()> function; // function is an int function with no parameters
    int someFunction(){
       return id*2;
    };
    void updateFunction(){
       newId = function();
    }
};

int someOtherFuntion(){
   return 3;
}

int main(){

    Object* obj[2];
    obj[0] = new Object(1);
    obj[1] = new Object(2);
    obj[0]->function = [=](){ return obj[1]->function(); }; // make a lambda function to bind function to obj[1]
    obj[1]->function = someOtherFuntion;

    for(int i = 0; i<2; i++){
       obj[i]->updateFunction();
    }
    return 1;
}

1
投票

这样会不会调用obj2和它的方法?

不会,这个程序是不规范的。

或复制obj2的方法?

函数是不能复制的。

请注意,我不想使用typedef,因为我是在单片机上使用的

我觉得这两件事之间完全没有关系。

我想把一个对象的方法传递给同一类的另一个对象。

成员函数是对同一类的所有实例都一样的东西。它们的地址不会因对象不同而不同。

从这个例子来看,你似乎想绑定一个成员函数的对象参数。你可以使用一个函数对象来实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.