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

相关问题