其他分享
首页 > 其他分享> > c – 通过升压信号2的观察者模式

c – 通过升压信号2的观察者模式

作者:互联网

所以,我已经阅读了Boost.Siganl2的文档,我已经做了一些Googleing,我还没有完全找到我需要的东西.我所拥有的是控制器和视图概念. Controller将数据发送到View以进行渲染.我想要的是在我的控制器中调用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’:当后跟’::’时必须是一个类或命名空间,但这只是因为我正在使用绑定错误.

有人知道如何使用带升压的信号/插槽来实现我想要的功能吗?

解决方法:

这里有很多误解.我建议你开始更简单.

> Listener基类可能需要一个虚拟析构函数
>您无法在Controller类中将Listener :: OnUpdate绑定到此类,因为Controller不是从Listener派生的
>您需要从Listener公开派生
>没有参数,所以你需要传递零占位符(_1不合适)

这是一个简单的固定样本

Live On 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 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中一个更引人注目的例子是:

Live On Coliru

#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

标签:c,boost,bind,observer-pattern,signals
来源: https://codeday.me/bug/20190725/1528701.html