2010-07-08 52 views
0

我在我的代碼中有一個類Yarl,其成員函數refresh我想綁定到兩個boost::signal s。這些信號之一是這樣定義的類EventHandler的成員:將函數連接到boost :: signal運行,但不調用函數

class EventHandler { 
    public: 
     boost::signal<void()> sigRefresh; 
}; 

另一種是聲明如下在另一個文件中的自由浮動的信號:

namespace utility { 
    static boost::signal<void()> signal_refresh; 
} 
Yarl成員函數

,我連接refresh到的信號是這樣的:

events::EventHandler eventHandler; 

    eventHandler.sigRefresh.connect(boost::bind(&Yarl::refresh, this)); 
    utility::signal_refresh.connect(boost::bind(&Yarl::refresh, this)); 

,後來我叫兩個信號是這樣的:

sigRefresh(); 
signal_refresh(); 

此代碼編譯並運行,sigRefresh按預期工作。但是,當我撥打signal_refresh時沒有任何反應。據我所知,refresh從來沒有實際上連接到signal_refresh。任何人看到我做錯了什麼?

+0

signals :: connect()返回signals :: connection的一個實例,它可以幫助您調試問題。對於初學者,請檢查連接()。 – fingerprint211b 2010-07-08 19:00:37

回答

1

我在猜測你是多重定義signal_refresh。靜態關鍵字在聲明之前向我暗示代碼片段位於頭文件中,並且必須將靜態代碼放在那裏才能在不重新定義符號錯誤的情況下進行編譯。如果你已經完成了這個任務,那麼包括頭文件在內的每個源文件都將得到一個唯一的signal_refresh副本,因此你所調用的實例可能不是你連接它的實例。

我可能完全不在這裏,但它是可能的。

+0

這正是我所做的。我認爲這是一種不好的做法,但這更像是一件很快的事情,看看我能不能做些什麼。會導致信號失敗? – Max 2010-07-08 21:08:54

+0

沒有信號沒有失敗。你只需要瞭解在這種情況下什麼靜態手段。將非類綁定變量聲明爲靜態使其對於翻譯單元(對象文件)是本地的,並且不會被導出。然後,您可以在每個對象文件中使用相同名稱的變量,而不會出現鏈接錯誤。您需要在標題中將信號定義爲extern,並在一個源文件中創建它*不帶static關鍵字。那麼你應該去。 – bradgonesurfing 2010-07-08 21:16:46

+0

它工作。謝謝你的幫助。 – Max 2010-07-08 21:31:00

相關問題