2013-01-10 48 views
0

在我一直在努力的項目中,我已經使用了boost的信號2。這工作得很好,直到我開始使用虛擬類。現在插槽不會再被調用。以下是我的項目的精簡版本。虛擬班級提升信號2

Class Glue創建類VSig和Process的實例,並將VSig中的信號連接到Process中的插槽。

IVSig.h:

class IVSig { 
public: 
    boost::signals2::signal<void (void)> sigTest; 
    virtual void update() = 0; 
}; 

VSig.h:

class VSig : public IVSig { 
public: 
    boost::signals2::signal<void (void)> sigTest; 
    void update(); 
}; 

VSig.cpp:

void VSig::update() 
{ 
    printf("updating!\n"); 
    sigTest(); 
} 

Process.h:

class Process { 
public: 
    void process(); 
}; 

Process.cpp:

void Process::process() 
{ 
    printf("hi!\n"); 
} 

Glue.h:

class Glue { 
public: 
    Glue(); 
    void callUpdate(); 

private: 
    IVSig *sig; 
    Process *proc; 
}; 

Glue.cpp:

Glue::Glue() 
{ 
    sig = new VSig(); 
    proc = new Process(); 

    sig->sigTest.connect(boost::bind(&Process::process, proc)); 

    callUpdate(); 
} 

void Glue::callUpdate() 
{ 
    sig->update(); 
} 

這應打印 '更新!'緊跟着'嗨!'但只輸出'更新!'。

任何幫助或建議,非常感謝!

回答

1

的問題是,因爲要在VSIG類重新聲明採用SigTest,並且當使用SIG->採用SigTest要訪問的IVSig類(聲明的類型)的採用SigTest構件,但是,當更新被執行你正在調用虛擬更新方法,它將使用它的本地sigTest變量。不知道我是否足夠清楚。

所以,經驗法則是:永遠不要在繼承類中重新定義一個具有相同名稱的變量。

希望有幫助!

+0

謝謝!這解決了這個問題。但我不認爲我明白爲什麼解決它。爲VSig創建一個實例,爲什麼在VSig中聲明的信號不會連接到Process中的插槽? – henkbelgium

+0

對不起我之前給出的簡短答案,現在詳細闡述 - 希望現在可以理解。 (請檢查正確的答案)。 – Filipe

+1

是的。謝謝。 – henkbelgium