问题
Given an example class:
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);
};
I get a compiler error at the line calling the member function through the pointer "*func(foo,bar)", saying: "term does not evaluate to a function taking 2 arguments". What am I doing wrong?
回答1:
The syntax you need looks like:
((object).*(ptrToMember))
So your call would be:
((*this).*(func))(foo, bar);
I believe an alternate syntax would be:
(this->*func)(foo, bar);
回答2:
You need the following funky syntax to call member functions through a pointer:
(this->*func)(foo, bar);
回答3:
There are two things you need to take care of. First is the declaration of the function pointer type:
private:
typedef double (Fred::*fptr)(int x, int y);
fptr func;
Next is the syntax for calling the function using a pointer:
(this->*func)(foo,bar)
Here is the modified sample code that will compile and run:
#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;
}
回答4:
A member function with two args is really a three arg function. 'this' is an implicit argument so the error you are getting is about missing the 'this' arg.
回答5:
Non static class member functions have hidden this pointer as an argument.
I think, the syntax (this->*func)(foo,bar) is the way to make compiler understand that it need to add this to the function.
来源:https://stackoverflow.com/questions/2898316/using-a-member-function-pointer-within-a-class