Я пытаюсь реализовать шаблон посредника в c++. Я пытаюсь передать адрес функции-члена функции другого класса (посредника) (SignOn), которая сохраняет эти функции обратного вызова в векторе, так что их можно вызвать для всех объектов Colleague.
Но я получаю следующую ошибку: "* ошибка C2664:" MediatorPattern :: Mediator :: SignOn ": невозможно преобразовать параметр 1 из 'void (__thiscall MediatorPattern :: Colleague :: *) (std :: string &)' to 'MediatorPattern :: Посредник :: CallBack & '* "
Мой вопрос заключается в том, нужно ли вести список всех объектов коллеги, которые "подписаны", в объекте "Медиатор"? Пожалуйста, помогите мне о том, где я ошибаюсь.
Вот код:
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);
}
}
Есть 2 ошибки:
Colleague::MyCallBack
должен принимать const string&
вместо string&
и Mediator::SignOn
должен использовать CallBack callBack_in
вместо CallBack callBack_in
CallBack&
CallBack
определяет указатель на функцию, поэтому переменная/параметр типа CallBack
должна быть инициализирована адресом функции (как и вы), но ваш SignOn
поскольку теперь он ссылается на CallBack
(избавиться от &
there ) У вас есть несовместимые сигнатуры функций. Измените MyCallback
чтобы получить постоянную ссылку на строку, например:
void MyCallBack(string const & msg_in)
// ^^^^^
В противном случае измените определение typedef Callback
.