在C ++中,我有很多函数(一,二三......),如下所示:
int MyClass::one(Mynamespace::Data* data)
{
//do something
return 0;
}
我还有一个动作函数,我想用它来调用带有函数指针的一个,两个,三个......函数。
int MyClass::action(Mynamespace::Data* data)
{
int (*actionFunction)(Mynamespace::Data*);
actionFunction = data->name; // the name is a string with the function name (one, two, three...)
return (*actionFunction)(data);
}
我得到的错误说:
int (MyClass::)(Mynamespace::Data*)’ does not match ‘int (*)(Mynamespace::Data*)
我做错了什么?如果有另一种方法可以快速简便地做到这一点,我也想学习它。 谢谢
答案 0 :(得分:4)
您需要一个将函数名称映射到函数地址的表。您可以使用类型为
的变量
std::map<std::string, int (MyClass::*)(Mynamespace::Data*)>
持有它。
ParaShift C ++ faq有an article on arrays of pointers to member functions在尝试之前你应该完全理解,因为这更复杂。
答案 1 :(得分:3)
C ++中指向非静态成员函数的指针与指向独立函数的指针不同。这是因为非静态成员函数必须在调用它们时隐式传递给它们。
因此,您无法将指向成员函数的指针指定给常规函数指针。编译器告诉你这个,但是以复杂的方式。编译器所说的是你试图分配一个类型的值:
int (MyClass::)(Mynamespace::Data*)
这就是你将指向MyClass的非静态成员的指针类型拼写为类型
的变量的方法int (*)(Mynamespace::Data*)
你拼写常规函数指针的类型是什么。
要解决此问题,您应该将actionFunction
的定义更改为以下
int (MyClass::* actionFunction)(Mynamespace::Data*)
其中声明了一个成员函数指针,然后当你通过返回行上的指针调用时,你应该使用member-function运算符来调用它:
return (this->*actionFunction)(data);