通过Boost信号的观察者模式2
Observer Pattern Via Boost Signal2
所以,我已经阅读了Boost.Signal2的文档,我在谷歌上做了一些搜索,但我还没有找到我需要的东西。我有一个控制器和一个视图概念。控制器将向视图发送数据,以便进行渲染。我想要的是我的控制器调用controller::Update并在视图中触发OnUpdate函数。
- 控制器和视图应不相交
- 可以发出控制器上的信号,以执行视图中的插槽
以下是我迄今为止尝试过的代码:
class Listener {
public:
virtual void OnUpdate() {};
};
class View :Listener
{
public:
View(void);
~View(void);
virtual void OnUpdate() override;
};
void View::OnUpdate()
{
std::cout << "Updating in View";
}
class Controller
{
public:
Controller(void);
~Controller(void);
void Update();
};
Controller::Controller(void)
{
// Signal with no arguments and a void return value
boost::signals2::signal<void ()> sig;
sig.connect(boost::bind(&Listener::OnUpdate, this, _1));
// Call all of the slots
sig();
system("pause");
}
这不会编译。我得到错误C2825:"F":后面跟有"::"时必须是类或命名空间,但这只是因为我使用绑定不正确。
有人知道我如何使用boost的信号/插槽来实现我想要的吗?
这里有很多误解。我建议你从简单开始。
- Listener基类可能需要一个虚拟析构函数
- 不能在
Controller
类中将Listener::OnUpdate
绑定到this
,因为Controller
不是从Listener
派生的 - 您需要从
Listener
公开派生 - 没有自变量,因此需要传递零个占位符(
_1
不合适)
这是一个简单的固定样本
在Coliru上直播
#include <boost/signals2.hpp>
#include <iostream>
class Listener {
public:
virtual ~Listener() = default;
virtual void OnUpdate() = 0;
};
class View : public Listener
{
public:
View() = default;
~View() = default;
virtual void OnUpdate() override {
std::cout << "Updating in Viewn";
}
};
class Controller
{
boost::signals2::signal<void ()> sig;
public:
Controller() {
}
void subscribe(Listener& listener) {
// Signal with no arguments and a void return value
sig.connect(boost::bind(&Listener::OnUpdate, &listener));
}
void DoWork() const {
// Call all of the slots
sig();
}
void Update();
};
int main() {
View l1, l2;
Controller c;
c.subscribe(l1);
std::cout << "One subscribed:n";
c.DoWork();
c.subscribe(l2);
std::cout << "nBoth subscribed:n";
c.DoWork();
}
打印:
One subscribed:
Updating in View
Both subscribed:
Updating in View
Updating in View
计算机,简化:现在是C++风格
也许C++中一个更引人注目的例子是:
在Coliru上直播
#include <boost/signals2.hpp>
#include <iostream>
struct View {
void OnUpdate() { std::cout << "Updating in Viewn"; }
};
class Controller {
using UpdateHandler = boost::signals2::signal<void()>;
UpdateHandler sig;
public:
Controller() {}
void subscribe(UpdateHandler::slot_type handler) { sig.connect(handler); }
void DoWork() const { sig(); }
void Update();
};
int main() {
View l1;
Controller c;
c.subscribe(std::bind(&View::OnUpdate, &l1));
c.subscribe([] { std::cout << "Or we can attach a random actionn"; });
c.DoWork();
}
哪个打印
Updating in View
Or we can attach a random action
相关文章:
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 反射 + 函数指针与观察者模式
- 观察者模式不起作用
- 观察者模式:为什么主题应该是抽象的?
- 观察者模式专业化
- 如何在不必绑定到特定类的情况下实现观察者模式
- C++,函数指针与观察者模式
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 实施观察者模式C
- C++自己的观察者模式
- 不同可观察量的观察者模式
- 通过Boost信号的观察者模式2
- 具有类型信息的观察者模式(C++)
- 代码设计:观察者模式
- 观察者模式和继承:未调用正确的函数
- C++和Qt:观察者模式错误
- 在C++中实现观察者模式
- 多少听众是太多的观察者模式
- C++ 观察者模式侦听器事件方法/类或信号和插槽
- 在Qt信号/槽的上下文中使用观察者模式