将成员函数地址传递给另一个类的函数

时间:2014-01-29 06:33:58

标签: c++ pointers design-patterns function-pointers argument-passing

我正在尝试用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);
}

}

2 个答案:

答案 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(摆脱&那里)