我正在尝试用c ++实现Mediator Pattern。 我试图将成员函数地址传递给另一个类(Mediator)函数(SignOn),它将这些回调函数保存在向量中,以便可以在所有Colleague对象上调用它们。
但我收到以下错误: “*错误C2664:'MediatorPattern :: Mediator :: SignOn':无法将参数1从'void(__thiscall MediatorPattern :: Colleague :: *)(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 :(得分:0)
你有不兼容的功能签名。更改MyCallback
以获取常量字符串引用,如下所示:
void MyCallBack(string const & msg_in)
// ^^^^^
否则,请更改Callback
typedef。
答案 1 :(得分:0)
有2个错误:
Colleague::MyCallBack
应该const string&
代替string&
且Mediator::SignOn
应采用CallBack callBack_in
代替CallBack&
CallBack
定义了一个指向函数的指针,因此类型CallBack
的变量/参数需要使用函数地址进行初始化(就像你一样),但是你的SignOn
因为它现在引用CallBack
(摆脱&
那里)