0

我想在 C++ 中使用指向成员函数的指针,但它不起作用:

指针声明:

int (MY_NAMESPACE::Number::*parse_function)(string, int);

指针赋值:

parse_function = &MY_NAMESPACE::Number::parse_number;

此调用完美运行(itd 是映射元素的迭代器):

printf("%s\t%p\n",itd->first.c_str(),itd->second.parse_function);

但这一个不起作用:

int ret = (itd->second.*parse_function)(str, pts);
$ error: 'parse_function' was not declared in this scope

而这个既不是

int ret = (itd->second.*(MY_NAMESPACE::Number::parse_function))(str, pts);
$ [location of declaration]: error: invalid use of non-static data member 'MY_NAMESPACE::Number::parse_function'
$ [location of the call]: error: from this location

我不明白为什么...

提前谢谢!!

4

2 回答 2

1
int (MY_NAMESPACE::Number::*parse_function)(string, int);

这表明,parse_function是一个指向类的成员函数的指针Number

此调用完美运行(itd 是映射元素的迭代器):

printf("%s\t%p\n",itd->first.c_str(),itd->second.parse_function);

从这里我们可以看到parse_function是 的成员itd->second,不管这是什么。

对于这个电话

int ret = (itd->second.*parse_function)(str, pts);

或者这个电话

int ret = (itd->second.*(MY_NAMESPACE::Number::parse_function))(str, pts);

要成功,itd->second必须是 type Number,它可能不是。并且 parse_function 必须定义为当前或封闭范围内的变量(第一种情况)或 Number 类的静态变量(第二种情况)。

所以你需要一些并Number申请parse_function

Number num;
(num.*(itd->second.parse_function))(str, pts);

或用指针

Number *pnum;
(pnum->*(itd->second.parse_function))(str, pts);

更新

由于itd->second是一个数字,你必须申请parse_function,它是它的成员,像这样

int ret = (itd->second.*(itd->second.parse_function))(str, pts);
于 2012-11-30T09:41:25.737 回答
0

您可以像这样定义指向函数的指针:type(*variable)() = &function; 例如:

int(*func_ptr)();
func_ptr = &myFunction;

我今天早上可能只是没有意识到你的代码,但问题可能是它parse_function是一个指针,但你把它叫做itd->second.*parse_function. 用 调用指针->*,所以尝试做itd->second->parse_function.

可能无法解决任何问题,我似乎无法真正理解您的代码。发布更多信息,很难从两行代码中分辨出来。


这是一个关于如何在实际代码中使用它的示例,这个示例仅func()通过cb()使用指针和参数进行调用:

int func()
{
    cout << "Hello" << endl;
    return 0;
}

void cb(int(*f)())
{
    f();
}

int main()
{
    int(*f)() = &func;
    cb(f);
    return 0;
}
于 2012-11-30T09:18:21.333 回答