2013-05-14 68 views
0

我試圖在一個類中的函數之間建立連接,以便我可以在另一個類中調用它。我發現的答案要麼太具體,要麼我錯過了一些東西,因爲我不能爲我的生活弄清楚我做錯了什麼。另外,我對助推庫有點新意,所以請原諒我可能會問的任何愚蠢問題。C++ Boost信號連接模板中兩個不同類的兩個函數

的設置爲我的工作流程基本上是這樣......

class MyClass : public BaseClass { 

    void setup(); 
    void myFunc(datatype); 

    OtherClass myOtherClass; 

} 

void setup() 
{ 
    OtherNamespace::addListener(this, myOtherClass); 
} 

namespace OtherNamespace { 

class OtherClass { 

    signals::signal<void (datatype)> myConnection; 

} 

template<class A, class B> 
void addListener(A * app, B & connection) 
{ 
    connection.myConnection.connect('I don't know what to do here'); 
} 
} 

基本上,功能的addListener不會使信號與功能之間的連接。我知道在哪裏我不知道該怎麼做我做錯了什麼,但我無法弄清楚它是怎麼回事。我將它作爲幫助函數,以便我可以將函數從一個類傳遞到另一個類,然後在連接時調用它們。我試圖從websocket連接創建一個多米諾骨牌活動,我顯然錯過了一件非常重要的事情。任何幫助將被真正讚賞。

我在xcode和boost和macbook pro。

回答

1

您應該連接到signal匹配slot,這是一個可調用具有適當的簽名。最好的辦法是離開插槽創建您addListener函數的調用者(以下是你的代碼,在SSCCE形式):

#include <boost/signals2.hpp> 

typedef int datatype; 
class BaseClass 
{}; 

namespace OtherNamespace 
{ 
    class OtherClass 
    { 
    public: 
    boost::signals2::signal<void (datatype)> myConnection; 
    }; 

    template<class A, class B> 
    void addListener(A app, B & connection) 
    { 
    connection.myConnection.connect(app); 
    } 
} 

class MyClass : public BaseClass 
{ 
public: 

    void setup(); 
    void myFunc(datatype) 
    {} 

    OtherNamespace::OtherClass myOtherClass; 

}; 

void MyClass::setup() 
{ 
    // let the caller decide how to make the slot 
    OtherNamespace::addListener(boost::bind(&MyClass::myFunc, this, _1), myOtherClass); 
}