クラスメンバーを別のメンバー関数へのポインターとして定義するにはどうすればよいですか? 質問する

クラスメンバーを別のメンバー関数へのポインターとして定義するにはどうすればよいですか? 質問する

同じクラス内の別の関数へのポインターであるクラスのメンバーとして関数ポインターを設定したいと思います。これを行う理由は複雑です。

この例では、出力を「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.*

おすすめ記事