你好,我是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] 。
没有办法用函数指针做你想做的事情,因为方法不能分配给函数指针。但是你可以用 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;
}
这样会不会调用obj2和它的方法?
不会,这个程序是不规范的。
或复制obj2的方法?
函数是不能复制的。
请注意,我不想使用typedef,因为我是在单片机上使用的
我觉得这两件事之间完全没有关系。
我想把一个对象的方法传递给同一类的另一个对象。
成员函数是对同一类的所有实例都一样的东西。它们的地址不会因对象不同而不同。
从这个例子来看,你似乎想绑定一个成员函数的对象参数。你可以使用一个函数对象来实现这一点。