【问题标题】:How to connect a boost::signal2::signal to a pure virtual function?如何将 boost::signals2::signal 连接到纯虚函数?
【发布时间】:2012-05-15 09:05:09
【问题描述】:

我在组件UpdateComponent 中使用boost::signals2::signals。此组件的特定聚合类型为Updateable。我希望Updateable 能够连接到UpdateComponentboost::signals2::signal。我应该注意到Updateableslotpure-virtual

下面是代码的具体示例:

// This is the component that emits a boost::signals2::signal.
class UpdateComponent {
    public:
        UpdateComponent();
        boost::signals2::signal<void (float)> onUpdate; // boost::signals2::signal
}

UpdateComponent 的代码中的某个时刻,我执行onUpdate(myFloat);我相信这类似于向所有“听众”“解雇”boost::signals2::signal

// The is the aggregate that should listen to UpdateComponent's boost::signals2::signal
class Updateable {
    public:
        Updateable();
    protected:
        virtual void onUpdate(float deltaTime) = 0; // This is the pure-virtual slot that listens to UpdateComponent.
        UpdateComponent* m_updateComponent;
}

Updateable 的构造函数中,我执行以下操作:

Updateable::Updateable {
    m_updateComponent = new UpdateComponent();
    m_updateComponent->onUpdate.connect(&onUpdate);
}

我收到以下两个错误:

  1. ...Updateable.cpp:8: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&amp;BalaurEngine::Traits::Updateable::onUpdate' [-fpermissive]
  2. /usr/include/boost/function/function_template.hpp:225: error: no match for call to '(boost::_mfi::mf1&lt;void, BalaurEngine::Traits::Updateable, float&gt;) (float&amp;)'

我应该提到我将 Qt 与 boost 结合使用。但是,我已将CONFIG += no_keywords 添加到我的.pro 文件中,因此两者应该可以顺利协同工作,如 boost 网站上所述。我不使用 Qt 的 signalsslots(效果很好)的原因是:我不希望 Updateable 成为 QObject

如果有人可以帮助我找出我收到错误的原因,将不胜感激!

【问题讨论】:

  • 我不能给出一个具体的例子,因为我没有对信号和插槽使用 boost,但我可以告诉你问题的出现是因为你试图连接到一个非静态成员函数,它隐式地将指向对象的指针作为参数。谷歌搜索表明使用boost::bind 是这样做的方法。
  • 谢谢你,tmpearce。正如 irobot 下面所说,这就是我的问题的原因。

标签: c++ qt boost architecture signals


【解决方案1】:

您传递给connect 的槽必须是函子。要连接到成员函数,您可以使用 boost::bind 或 C++11 lambda。例如使用 lambda:

Updateable::Updateable {
    m_updateComponent = new UpdateComponent();
    m_updateComponent->onUpdate.connect(
        [=](float deltaTime){ onUpdate(deltaTime); });
}

或使用bind:

Updateable::Updateable {
    m_updateComponent = new UpdateComponent();
    m_updateComponent->onUpdate.connect(
        boost::bind(&Updateable::onUpdate, this, _1));
}

【讨论】:

  • 谢谢你,irobot。我不知道这一点。
  • 好吧,如果它按照你的方式工作就好了!
  • 是的!我被 Qt 的 SIGNALS 和 SLOTS 宏(类似的语法)宠坏了,我承认,这让生活变得更加愉快。但是,使用 Qt 的 SIGNALS 和 SLOTS 意味着您必须从 QObject 继承,这会使给定的类膨胀。再次感谢 irobot 的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多