【问题标题】:Passing member function address to another class`s function将成员函数地址传递给另一个类的函数
【发布时间】:2014-02-20 19:47:05
【问题描述】:

我正在尝试在 C++ 中实现中介者模式。 我正在尝试将成员函数地址传递给另一个类的(Mediator)函数(SignOn),该函数将这些回调函数保存在一个向量中,以便可以在所有同事对象上调用它们。

但我收到以下错误: "*error 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);
}

}

【问题讨论】:

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


    【解决方案1】:

    有2个错误:

    • Colleague::MyCallBack 应采用 const string&amp; 而不是 string&amp;

    • Mediator::SignOn 应该使用CallBack callBack_in 而不是CallBack&amp;

      • CallBack 类型定义了一个指向函数的指针,因此CallBack 类型的变量/参数需要用函数地址初始化(就像你一样),但你现在的SignOn 需要一个参考CallBack(去掉&amp;那里)

    【讨论】:

      【解决方案2】:

      您的函数签名不兼容。更改 MyCallback 以获取常量字符串引用,如下所示:

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

      否则,更改Callback typedef 的定义。

      【讨论】:

      • 更改了 CallBack 的定义,但仍然出现相同的错误。我认为这与 CallBack 函数指针的范围有关。不过还是谢谢你的回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多