无法将'void(myClass :: *)()转换为void(*)()

时间:2016-03-30 13:44:56

标签: c++ c++11 member-function-pointers

所以,我知道这个问题存在于很多地方。但是这些例子都没有帮助我解决我的问题。

我正在尝试创建一个方法指针(在一个类中),因此它将根据特定条件解决该类中的几种方法之一。

我试过使用静态函数失败了(猜测我误解了说明怎么做......)。

这是头文件:

class myClass
{
public:
    myClass(int value);

    void methodA(const string &msg);
    void methodB(const string &msg);

    void (*send_msg)(const string &msg);
};

和cpp:

myClass::myClass(int value){
    if(value > 0){
        send_msg = &methodA
    }
    else{
        send_msg = &methodB
    }
}

和错误,正如你们中的一些人已经知道的那样:

  

错误:ISO C ++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针。说'& myClass :: methodA'[-fpermissive]

     

错误:无法将'void(myClass :: )(const string&){aka void(myClass :: )(const std :: basic_string&)}'转换为'void()(const string&){aka void()(const std :: basic_string&)}'赋值

任何帮助将不胜感激。

修改 感谢Jose,可以编译:

void (myClass::*send_msg)(const string &msg);

和作业:

send_msg = &myClass::methodA;

但是现在,因为我正在尝试使用代码,所以无法调用函数指针:

this->myClass_instance.send_msg(line); //*****getting error*****

this是其他类的实例时。 错误是:

  

错误:必须使用'。'或' - > '在'((otherClass *)this中调用指向成员函数的函数 - > otherClass :: myClass_instance.myClass: :send_msg(...)',例如'(... - > *((otherClass *)this) - > otherClass :: myClass_instance.myClass :: send_msg)(...)'

3 个答案:

答案 0 :(得分:2)

我的演示:http://ideone.com/Vx4x88

通过添加myClass::使send_msg成为指向类方法的指针。

void (myClass::*send_msg)(const string &msg);

此外,您似乎错过了myClass::和分号;的结尾

    send_msg = &myClass::methodA;
else
    send_msg = &myClass::methodB;

编辑:

由于您的要求如何在评论中从课堂外调用它:

myClass c(1);
(c.*c.send_msg)("hi");

myClass * p = new myClass(1);
(p->*p->send_msg)("hi");

答案 1 :(得分:2)

void (*send_msg)(const string &msg);是自由函数或静态成员函数的指针声明,而不是非静态成员函数。你可能想要:

void (myClass::*send_msg)(const string &msg);

LIVE1

或者你可以使函数成为静态成员函数:

static void methodA(const string &msg);
static void methodB(const string &msg);

LIVE2

对于第一个编译错误,您应该在获取其地址时限定非静态成员函数的名称(仅适用于第一个解决方案):

myClass::myClass(int value){
    if(value > 0){
        send_msg = &myClass::methodA;
                    ~~~~~~~~~
    }
    else{
        send_msg = &myClass::methodB;
                    ~~~~~~~~~
    }
}

答案 2 :(得分:2)

您也可以使用std::function

#include <functional>

class myClass
{
public:
    myClass(int value){
     if(value > 0){
        send_msg = [this](const std::string& str){ methodA(str); };
     }
     else{
         send_msg = [this](const std::string& str){ methodB(str); };
     }
    }

    void methodA(const string &msg);
    void methodB(const string &msg);

    std::function<void(const string &msg)> send_msg;
};

调用该函数,只需使用()

myClass obj(10);
obj.send_msg("hi there");