如果您绝对需要通过指针调用函数,则需要使用指向成员函数的指针而不是指向函数的指针。指向成员函数的指针具有不同的声明语法,其中包括函数所属的类类型。在您的情况下,参数声明看起来像int (A::*cp)()
. 您还需要将f
成员变量的声明更改为int (A::*f)()
.
为了调用指向成员函数的指针,您需要有一个指向该函数所属类型的对象的指针。您还需要使用指向成员运算符的指针之一;->*
或者.*
void call(A* c, int (A::*f)())
{
(c->*f)(); // call member function through pointer
}
由于运算符的优先顺序,需要额外的括号。
以下代码包含使用指向成员函数的指针所需的更改。
class A
{
public:
class B
{
public:
// Take a pointer to member function.
B(int(A::*cf)())
{
f = cf;
}
void call(A* c)
{
(c->*f)();
}
int (A::*f)(); // pointer to member function
};
B *b;
A()
{
b = new B(&A::a);
}
int a()
{
return 0;
}
};
int main()
{
A a;
a.b->call(&a);
}
我还建议您考虑使用std::function
and std::bind
(如果您没有 C++11 编译器,则使用它们的 Boost 等效项)。