通过Boost信号的观察者模式2

Observer Pattern Via Boost Signal2

本文关键字:观察者模式 信号 Boost 通过      更新时间:2023-10-16

所以,我已经阅读了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