2

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

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

4

2 回答 2

4

您需要一个将函数名称映射到函数地址的表。您可以使用类型的变量
std::map<std::string, int (MyClass::*)(Mynamespace::Data*)>来保存它。

ParaShift C++ 常见问题解答有一篇关于指向成员函数的指针数组的文章,在尝试此操作之前您可能应该完全理解,因为这更复杂。

于 2013-07-05T08:03:33.323 回答
3

C++ 中指向非静态成员函数的指针与指向独立函数的指针不同。这是因为非静态成员函数在被调用时必须有一个 this 指针隐式传递给它们。

因此,您不能将指向成员函数的指针分配给常规函数指针。编译器告诉你这一点,但方式很复杂。编译器的意思是您正在尝试分配一个类型的值:

int (MyClass::)(Mynamespace::Data*)

这就是您如何将指向 MyClass 的非静态成员的指针的类型拼写为类型的变量

int (*)(Mynamespace::Data*)

这就是您拼写常规函数指针类型的方式。

要修复它,您应该将定义更改为actionFunction以下

int (MyClass::* actionFunction)(Mynamespace::Data*)

其中声明了一个成员函数指针,然后当您通过返回行上的指针调用时,您应该使用成员函数运算符来调用它,如下所示:

return (this->*actionFunction)(data);
于 2013-07-05T08:09:33.163 回答