我是C ++的新手,我在一个项目中苦苦挣扎,需要在不同的类实例之间传递对回调方法的引用。我知道这个主题对于C ++初学者来说是一个非常普遍的问题。我了解成员函数指针与“标准”函数指针不同,但是我找不到任何可以解决我的特定问题的帖子(但这可能是因为鉴于我缺乏C ++的经验,所以我不理解所提供的答案)。
我尝试开发的系统基于:
我想做的是从说一个 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类中不存在),以便它可以调用这些方法。
如果有人可以帮助我,我先感谢他/她。
答案 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();});
}
};