Передача адреса функции-члена в функцию другого класса

0

Я пытаюсь реализовать шаблон посредника в 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);
}

}
Теги:
pointers
design-patterns
function-pointers
argument-passing

2 ответа

0
Лучший ответ

Есть 2 ошибки:

  • Colleague::MyCallBack должен принимать const string& вместо string&

  • и Mediator::SignOn должен использовать CallBack callBack_in вместо CallBack callBack_in CallBack&

    • тип CallBack определяет указатель на функцию, поэтому переменная/параметр типа CallBack должна быть инициализирована адресом функции (как и вы), но ваш SignOn поскольку теперь он ссылается на CallBack (избавиться от & there )
  • 0
    Спасибо, это решает проблему.
  • 0
    @Anitesh: Всегда пожалуйста :)
0

У вас есть несовместимые сигнатуры функций. Измените MyCallback чтобы получить постоянную ссылку на строку, например:

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

В противном случае измените определение typedef Callback.

  • 0
    Изменено определение CallBack, но все равно появляется та же ошибка. Я думаю, что это как-то связано с областью указателя на функцию CallBack. Спасибо за ответ, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню