带字符串的C ++函数指针

时间:2013-07-05 08:01:26

标签: c++ function pointers

在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*)

我做错了什么?如果有另一种方法可以快速简便地做到这一点,我也想学习它。 谢谢

2 个答案:

答案 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);