通过升压信号 2 的观察者模式
Observer Pattern Via Boost Signal2
所以,我已经阅读了 Boost.Signal2 的文档,并且进行了一些谷歌搜索,但我还没有完全找到我需要的东西。我拥有的是一个控制器和一个视图概念。 Controller 将向 View 发送数据以供其呈现。我想要的是我的控制器调用 Controller::Update 并在视图中触发 OnUpdate 函数。
- 控制器和视图应该是不相交的
- 可以发出 Controller 上的信号来执行 View
中的 Slots
这是我目前试过的代码:
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");
}
这不编译。我收到 error C2825: 'F': must be a class or namespace when followed by '::',但这只是因为我使用 bind 不正确.
有人知道我如何使用来自 boost 的 signals/slots 实现我想要的吗?
这里有很多误解。我建议你从简单的开始。
- 监听器基础class可能需要一个虚拟析构函数
- 您不能将
Listener::OnUpdate
绑定到 Controller
class 中的 this
因为 Controller
不是从 Listener
[=49= 派生的]
- 您需要从
Listener
中公开
- 没有参数,因此您需要传递零占位符(
_1
不合适)
这是一个简单的修复示例
#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 View\n";
}
};
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++ 中更引人注目的示例是:
#include <boost/signals2.hpp>
#include <iostream>
struct View {
void OnUpdate() { std::cout << "Updating in View\n"; }
};
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 action\n"; });
c.DoWork();
}
打印
Updating in View
Or we can attach a random action
所以,我已经阅读了 Boost.Signal2 的文档,并且进行了一些谷歌搜索,但我还没有完全找到我需要的东西。我拥有的是一个控制器和一个视图概念。 Controller 将向 View 发送数据以供其呈现。我想要的是我的控制器调用 Controller::Update 并在视图中触发 OnUpdate 函数。
- 控制器和视图应该是不相交的
- 可以发出 Controller 上的信号来执行 View 中的 Slots
这是我目前试过的代码:
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");
}
这不编译。我收到 error C2825: 'F': must be a class or namespace when followed by '::',但这只是因为我使用 bind 不正确.
有人知道我如何使用来自 boost 的 signals/slots 实现我想要的吗?
这里有很多误解。我建议你从简单的开始。
- 监听器基础class可能需要一个虚拟析构函数
- 您不能将
Listener::OnUpdate
绑定到Controller
class 中的this
因为Controller
不是从Listener
[=49= 派生的] - 您需要从
Listener
中公开
- 没有参数,因此您需要传递零占位符(
_1
不合适)
这是一个简单的修复示例
#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 View\n";
}
};
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++ 中更引人注目的示例是:
#include <boost/signals2.hpp>
#include <iostream>
struct View {
void OnUpdate() { std::cout << "Updating in View\n"; }
};
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 action\n"; });
c.DoWork();
}
打印
Updating in View
Or we can attach a random action