gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:50 24 4
gpt4 key购买 nike

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

我尝试开发的系统是基于:

  • ControllerManager 类(单例)
  • 一个 Controller 基类
  • 继承自Controller类的一些具体的Controller类(FanControllerLightController等)

我想做的是从一个 FanController 实例调用 ControllerManager 类的 addCallback 方法。此方法会将指向 FanController 的任何公共(public)方法的指针作为参数,以便 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 类声明的方法。

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

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

最佳答案

解决这个问题的现代方法是在 lambda 中松开方法的绑定(bind)。

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

关于C++ 将成员函数引用从一个类实例传递到另一个类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56099876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com