C ++将成员函数引用从一个类实例传递到另一个类实例

时间:2019-05-12 13:47:31

标签: c++ callback

我是C ++的新手,我在一个项目中苦苦挣扎,需要在不同的类实例之间传递对回调方法的引用。我知道这个主题对于C ++初学者来说是一个非常普遍的问题。我了解成员函数指针与“标准”函数指针不同,但是我找不到任何可以解决我的特定问题的帖子(但这可能是因为鉴于我缺乏C ++的经验,所以我不理解所提供的答案)。

我尝试开发的系统基于:

  • ControllerManager 类(单例)
  • 控制器基类
  • 某些继承自Controller类的特定Controller类( FanController LighController 等)

我想做的是从说一个 FanController 实例调用 ControllerManager 类的 addCallback 方法。此方法将指向FanController的任何公共方法的指针作为参数,以便ControllerManager以后可以对该方法进行回调(我必须指定ControllerManager包括Controller类的定义,但对FanController类)

到目前为止,我还没有找到任何可行的解决方案,我设法获得的唯一解决方法是非常差的解决方法(为简单起见,仅指示了相关方法):

class Controller {

public:
    virtual void callback();
};


class FanController:Controller {

public:
    virtual void callback();
};


class ControllerManager
{
private:
    static ControllerManager *_instance;
    Controller *_controller;

public:

    void addCallback(Controller * controller)
    {
        _controller = controller;
    }

    static void periodicCallback()
    {
       _instance->_controller->callback();
    }
};

在运行时,FanController实例提供对ControllerManager单例的自身引用:

ControllerManager::getInstance()->addController(this);

并且ControllerManager可以调用FanController实例的回调方法:

 _instance->_controller->callback();

此解决方法非常有限,因为它仅允许调用父 Controller 类声明的方法。

我要实现的系统是允许特定控制器向ControllerManager提供其成员方法的引用(在Controller类中不存在),以便它可以调用这些方法。

如果有人可以帮助我,我先感谢他/她。

1 个答案:

答案 0 :(得分:0)

解决此问题的现代方法是在lambda中松开方法的绑定。

#include <functional>
#include <vector>


class Controller {
  std::vector<std::function<void()>> callbacks_;

public: 
  void addCallback(std::function<void()> cb) {
      callbacks_.push_back(std::move(cb));
  }

  void periodicCallback() {
     for(const auto& cb : callbacks_) {
       cb();
     }
  }
};


class Fan {
public:
  void whatever() {}

  void register_in_controller(Controller* tgt) {
    tgt->addCallback([this]{whatever();});
  }
};