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

时间:2013-01-14 18:31:25

标签: c++ function-pointers typedef

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

error: must use '.*' or '->*' to call pointer-to-member function ...

源代码:

#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;
}

5 个答案:

答案 0 :(得分:3)

d.func(&d);

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

(this->*(d.func))(&d);

只要你在A内写下这个就行了。

如果你想从外面执行func,比如main(),那么语法是:

A a; 
(a.*(a.d.func))(&a.d);

这是一种难看的语法。

答案 1 :(得分:1)

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

void process()
{
    (this->*(d.func))(&d);
}

注意使用->*运算符在有指向它的指针时调用成员函数。

答案 2 :(得分:0)

其他答案已经说过你需要说(this->*d.func)(&d)来调用指向成员的指针函数(因为你需要提供它是 成员的对象)

另一种选择是使函数成为静态函数,不需要特殊的语法来调用。为此,请更改typedef,如下所示:

typedef int (*func_t)(data *);

然后将print函数设为静态:

static int print(data *d)
{
    ...
}

现在您可以致电d.func(&d)

答案 3 :(得分:-1)

不幸的是,您尝试做的事情是不可能的,原因是print不是static成员函数。这意味着它需要一个隐含的第一个参数,即this指针。

我建议您尝试使用std::functionstd::bind功能,如下所示:

class A
{
    struct data
    {
        std::function<void(const data&)> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

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

    void print(const data& my_data)
    {
        std::cout << my_data.i << '\n';
    }
};

当然,由于print函数现在有一个正确的this指针,您不再需要将数据结构传递给它:

class A
{
    struct data
    {
        std::function<void()> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

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

    void print()
    {
        std::cout << d.i << '\n';
    }
};

答案 4 :(得分:-2)

调用指针成员需要它所属的类成为此参数。

尝试:

A a;
a.*(d.func)(&d);