给出一个示例类:
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)”调用成员函数的行中遇到编译器错误,说:“术语不会计算为带有2个参数的函数”。我做错了什么?
答案 0 :(得分:19)
您需要的语法如下:
((object).*(ptrToMember))
所以你的电话会是:
((*this).*(func))(foo, bar);
我相信另一种语法是:
(this->*func)(foo, bar);
答案 1 :(得分:6)
您需要以下时髦的语法才能通过指针调用成员函数:
(this->*func)(foo, bar);
答案 2 :(得分:4)
您需要照顾两件事。首先是函数指针类型的声明:
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;
}
答案 3 :(得分:1)
具有两个args的成员函数实际上是一个三个arg函数。 'this'是一个隐含的参数,所以你得到的错误就是错过'this'arg。
答案 4 :(得分:0)
非静态类成员函数已将此指针隐藏为参数。
我认为,语法 (这 - &GT * FUNC)(FOO,巴) 是让编译器理解它需要将它添加到函数中的方法。