絶対にポインターで関数を呼び出す必要がある場合は、関数へのポインターではなく、メンバー関数へのポインターを使用する必要があります。メンバー関数へのポインターには、関数が属するクラス型を含む別の宣言構文があります。あなたの場合、パラメータ宣言は次のようになります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) の使用を検討することをお勧めします。