0

我想在C++中實現中介模式。 我試圖將成員函數地址傳遞給另一個類的中介函數(SignOn),該函數將這些回調函數保留在向量中,以便可以在所有同事對象上調用它們。將成員函數地址傳遞給另一個類的函數

但我得到以下錯誤: 「*錯誤C2664: 'MediatorPattern ::中保::點登錄':無法從「無效轉換參數1(__thiscall MediatorPattern ::同事:: *)(的std :: string & )''到'MediatorPattern :: Mediator :: CallBack &'*「

我的問題是需要維護一個所有在'Mediator'對象上簽名的同事對象的列表嗎? 請幫我瞭解我錯在哪裏。

下面是代碼:

namespace MediatorPattern 
{ 

class Mediator; 
class Colleague 
{ 
    string _name; 
    int _id; 
    Mediator* p_myMediator; 
    string _msg; 
public: 
    Colleague(Mediator *pMediator, string s, int id):_name(s), _id(id) 
    { 
     p_myMediator = pMediator; 
     _msg = "Hi ! I am " + _name; 
    } 
    void MyCallBack(string& msg_in /*message part from mediator*/) 
    { 
     cout<< _msg << msg_in<< endl; 
    } 
    void SubscribeBroadcast(); 
}; 

class Mediator 
{ 
    typedef void (Colleague::*CallBack)(const string& s); 
    std::vector<CallBack> vecRecieverCallBack; 
    //typedef std::vector<CallBack>::iterator VecIterator; 

public: 
    void SignOn(CallBack& callBack_in) 
    { 
     vecRecieverCallBack.push_back(callBack_in); 
    } 
    /*void Send(const string& s_in) 
    { 
     VecIterator it_begin = vecRecieverCallBack.begin(); 
     VecIterator it_end = vecRecieverCallBack.end(); 
     for(; it_begin != it_end; ++it_begin) 
     { 
     (*it_begin)(s_in); 
     } 
    }*/ 

}; 

void Colleague::SubscribeBroadcast() 
{ 
    p_myMediator->SignOn(&Colleague::MyCallBack); 
} 

} 

回答

0

有2個錯誤:

  • Colleague::MyCallBack應該採取const string&代替string&

  • Mediator::SignOn應該採取CallBack callBack_in代替CallBack&

    • 類型CallBack定義起作用的指針,所以可變/ CallBack類型的參數需要用的功能(就像你這樣做)地址被初始化,但你的SignOn因爲它現在需要到CallBack(擺脫&有)的引用
+0

謝謝,這解決了這個問題。 – Anitesh

+0

@Anitesh:不客氣:) – LihO

0

你有不兼容的函數簽名。更改MyCallback採取一個常量字符串的參考,像這樣:

void MyCallBack(string const & msg_in) 
//      ^^^^^ 

否則,改變Callback的typedef的定義。

+0

改變了定義的回調,但仍然有相同的錯誤。我認爲它與CallBack函數指針的作用域有關。儘管謝謝你的回覆。 – Anitesh

相關問題