首页 文章

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

提问于
浏览
3

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

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

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

这是头文件:

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字符串&){aka void()(const std :: basic_string&)}'在赋值中

任何帮助都感激不尽 .

Edit 感谢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 回答

  • 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");
    
  • 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

    你也可以用 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");
    

相关问题