首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -使用指向成员函数的函数指针的问题

C++ -使用指向成员函数的函数指针的问题
EN

Stack Overflow用户
提问于 2013-01-15 02:31:25
回答 5查看 201关注 0票数 0

我已经应用了一些基于搜索的解决方案,但问题仍然存在。非常感谢你的帮助。

代码语言:javascript
复制
error: must use '.*' or '->*' to call pointer-to-member function ...

源代码:

代码语言:javascript
复制
#include <stdio.h>

class A
{
  public:

    struct data;
    typedef int (A::*func_t)(data *);
    typedef struct data
    {
      int i;
      func_t func;
    }
    data;

    data d;

    void process()
    {
        d.func(&d);
    }

    A()
    {
        d.i = 999;
        d.func = &A::print;
    }

    int print(data *d)
    {
        printf("%d\n", d->i);
        return 0;
    }

};

int main()
{
    A *a = new A;

    a->process();

    return 0;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-15 02:38:42

您的process函数试图调用d.func,但它是指向成员函数的指针。必须在某个对象上调用指向成员函数的指针。假设您希望A实例为this,在这种情况下,您的process函数应该如下所示:

代码语言:javascript
复制
void process()
{
    (this->*(d.func))(&d);
}

请注意,当您有指向成员函数的指针时,使用->*运算符来调用该成员函数。

票数 1
EN

Stack Overflow用户

发布于 2013-01-15 02:39:10

代码语言:javascript
复制
d.func(&d);

是不够的。func是指向A的非静态成员的成员函数指针。因此它可以在A的对象上调用。所以你需要这样写:

代码语言:javascript
复制
(this->*(d.func))(&d);

只要您在A中编写这段代码,它就可以工作。

如果你想从外部执行func,比如在main()中,那么语法是这样的:

代码语言:javascript
复制
A a; 
(a.*(a.d.func))(&a.d);

这是一个丑陋的语法。

票数 3
EN

Stack Overflow用户

发布于 2013-01-15 02:49:48

其他答案已经指出,您需要使用(this->*d.func)(&d)来调用指向成员的指针函数(因为您需要提供它所属的对象)。

另一种选择是使函数成为静态函数,它不需要特殊的语法来调用。要做到这一点,请按如下方式更改typedef:

代码语言:javascript
复制
typedef int (*func_t)(data *);

然后将print函数设为静态函数:

代码语言:javascript
复制
static int print(data *d)
{
    ...
}

现在您可以只调用d.func(&d)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14324377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档