11

给定一个示例类:

class Fred
{
public:
Fred() 
{
    func = &Fred::fa;
}

void run()
{
     int foo, bar;
     *func(foo,bar);
}

double fa(int x, int y);
double fb(int x, int y);

private:
double (Fred::*func)(int x, int y);
};

我在通过指针“*func(foo,bar)”调用成员函数的行出现编译器错误,说:“term 不计算为带 2 个参数的函数”。我究竟做错了什么?

4

5 回答 5

22

您需要的语法如下所示:

((object).*(ptrToMember)) 

所以你的电话是:

((*this).*(func))(foo, bar);

我相信另一种语法是:

(this->*func)(foo, bar);
于 2010-05-24T16:05:13.217 回答
7

您需要以下时髦的语法来通过指针调用成员函数:

(this->*func)(foo, bar);
于 2010-05-24T16:05:38.383 回答
6

您需要注意两件事。首先是函数指针类型的声明:

private:
  typedef double (Fred::*fptr)(int x, int y);
  fptr func;

接下来是使用指针调用函数的语法:

(this->*func)(foo,bar)

以下是将编译和运行的修改后的示例代码:

#include <iostream>

class Fred
{
public:
  Fred() 
  {
    func = &Fred::fa;
  }

  void run()
  {
    int foo = 10, bar = 20;
    std::cout << (this->*func)(foo,bar) << '\n';
  }

  double fa(int x, int y)
  {
    return (double)(x + y);
  }
  double fb(int x, int y)
  {
  }

private:
  typedef double (Fred::*fptr)(int x, int y);
  fptr func;
};

int
main ()
{
  Fred f;
  f.run();
  return 0;
}
于 2010-05-24T16:28:30.303 回答
1

具有两个 args 的成员函数实际上是一个三个 arg 函数。'this' 是一个隐式参数,因此您得到的错误是关于缺少 'this' 参数。

于 2010-05-24T17:02:03.230 回答
0

非静态类成员函数已将此指针隐藏为参数。

我认为,语法 (this->*func)(foo,bar) 是让编译器理解它需要将它添加到函数的方法。

于 2010-05-24T16:46:11.483 回答