次のようなコードを時々見かけます。
class A {
int b;
}
void foo() {
int* blah = &A::b;
// Other stuff.
}
しかし、クラスのインスタンスなしでクラスのメンバー変数のアドレスを取得することは、どのように役立つでしょうか? それは何をするためのものか?
コードの形式が正しくないため、コンパイルできません。の型は ではblah
なくint*
ですint (A::*)
。つまり、「へのポインター」ではなく、「型がint
であるクラス型のデータ メンバーへのポインター」A
ですint
。
メンバーへのポインターを取得するには、メンバーにアクセスできる必要があることに注意してください。で計算する&A::b
にはfoo()
、b
パブリック データ メンバーであるfoo()
必要があるか、 のフレンドである必要がありA
ます。
メンバーへのポインターはオブジェクトを指しません。むしろ、メンバーへのポインターをオブジェクトにバインドして、そのデータ メンバーの値を取得できます。メンバへのポインタを のインスタンスにバインドすることによりb
、オブジェクトのデータ メンバの値を取得できます。例えば、A
blah
A
A x;
int b_value = x.*blah; // b_value has the value of x.b
クラスA
にはintがありb
ます。つまりb
、クラスのデータです。のインスタンスがある場合は、へのA
ポインタを取得できます。b
A
私はあなたがこのケースを求めたいと思います:
class A{
int foo(int i) {
}
}
コンパイル後、メソッドfooにはアドレスがあり、へのポインタを取得できます&A::foo
。