同じクラス内の別の関数へのポインターであるクラスのメンバーとして関数ポインターを設定したいと思います。これを行う理由は複雑です。
この例では、出力を「1」にしたいです。
class A {
public:
int f();
int (*x)();
}
int A::f() {
return 1;
}
int main() {
A a;
a.x = a.f;
printf("%d\n",a.x())
}
しかし、これはコンパイルに失敗します。なぜでしょうか?
ベストアンサー1
構文が間違っています。メンバー ポインターは通常のポインターとは異なる型カテゴリです。メンバー ポインターは、そのクラスのオブジェクトと一緒に使用する必要があります。
class A {
public:
int f();
int (A::*x)(); // <- declare by saying what class it is a pointer to
};
int A::f() {
return 1;
}
int main() {
A a;
a.x = &A::f; // use the :: syntax
printf("%d\n",(a.*(a.x))()); // use together with an object of its class
}
a.x
関数がどのオブジェクトで呼び出されるかはまだ指定されていません。オブジェクトに格納されているポインターを使用する必要があるとだけ指定されています。演算子の左オペランドとしてもう一度a
先頭に追加することで、どのオブジェクトで関数を呼び出すかをコンパイラーに指示します。a
.*