使用函数指针指向成员函数的问题

C++ - Issue of using function pointer to member function

本文关键字:函数 成员 问题 指针      更新时间:2023-10-16

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

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("%dn", d->i);
        return 0;
    }
};
int main()
{
    A *a = new A;
    a->process();
    return 0;
}
d.func(&d);

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

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

只要你在A里面写这个就可以了。

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

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

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

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

注意,当有指向成员函数的指针时,使用->*操作符来调用成员函数

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

另一个选择是使函数成为静态函数,它不需要特殊的语法来调用。要做到这一点,像这样改变类型定义:

typedef int (*func_t)(data *);

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

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

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

不幸的是,您要做的将是不可能的,原因是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';
    }
};

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

试题:

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