【问题标题】:Pass adress of an object method to another object for it to call将对象方法的地址传递给另一个对象以供其调用
【发布时间】:2020-08-22 16:02:55
【问题描述】:

您好,我在 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]

【问题讨论】:

  • 会这样吗?当你尝试时发生了什么?
  • 请出示真实代码。您缺少;main 必须返回int。同样在您的示例中,它与调用该方法的对象无关。你到底想达到什么目的?

标签: c++ class pointers methods


【解决方案1】:

没有办法处理你想要的函数指针,因为方法不能分配给函数指针。但是你可以使用std::function 做你想做的事,它比函数指针更灵活,并使用 lambda 函数 将你的方法绑定到特定对象,

#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;
}

【讨论】:

  • 完美!有没有办法直接在构造函数中执行此操作?
  • Object 的构造函数?只需像将任何参数传递给构造函数一样传入函数即可。
【解决方案2】:

这会调用 obj2 及其方法吗?

没有。程序格式不正确。

还是拷贝obj2的方法?

函数不能复制。

请注意我不想使用 typedef,因为我在微控制器上

我认为这两件事之间没有任何关系。

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

成员函数对于同一类的所有实例都是相同的。它们的地址在一个对象与另一个对象之间没有区别。

从示例来看,您似乎想要绑定成员函数的对象参数。您可以使用函数对象来执行此操作。

【讨论】:

  • 但是他们从这个对象返回值。在这种情况下,我希望 obj.function 返回 obj2 的 id
  • @michox 只需将 obj2 作为对象参数传递给成员函数。
  • 感谢您的回答,不幸的是,我可能没有正确描述该功能的用途,我深表歉意。让我重新表述我的问题并更新我的代码
猜你喜欢
  • 1970-01-01
  • 2012-03-01
  • 2015-09-15
  • 1970-01-01
  • 2023-03-24
  • 2019-05-02
  • 1970-01-01
  • 2015-06-14
  • 2012-09-15
相关资源
最近更新 更多