所以,我知道这个问题存在于很多地方 . 但是这些例子都没有帮助我解决我的问题 .
我正在尝试创建 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 回答
我的演示:http://ideone.com/Vx4x88
通过添加
myClass::
使send_msg成为指向类方法的指针 .此外,似乎你错过了
myClass::
和一个分号;
在结束时编辑:
由于您的请求如何在评论中从课外调用它:
要么
void (*send_msg)(const string &msg);
是自由函数或静态成员函数的指针声明,而不是非静态成员函数 . 你可能想要:LIVE1
或者你可以使函数成为静态成员函数:
LIVE2
对于第一个编译错误,您应该在获取其地址时限定非静态成员函数的名称(仅针对第一个解决方案):
你也可以用
std::function
要调用该函数,只需使用
()
: