所以,我知道这个问题存在于很多地方。但是这些例子都没有帮助我解决我的问题。
我正在尝试创建一个方法指针(在一个类中),因此它将根据特定条件解决该类中的几种方法之一。
我试过使用静态函数失败了(猜测我误解了说明怎么做......)。
这是头文件:
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)(...)'
答案 0 :(得分:2)
通过添加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);
或者你可以使函数成为静态成员函数:
static void methodA(const string &msg);
static void methodB(const string &msg);
对于第一个编译错误,您应该在获取其地址时限定非静态成员函数的名称(仅适用于第一个解决方案):
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");