0

今まで見たことのないものを見つけた投稿を見たところです。要するに、次のとおりです。

class A {
public:
    int _x;
};

void foo(A *a_ptr, int *m_ptr)
{
    cout << (*a_ptr).*m_ptr << endl;  // here
}

int main()
{
    A a;
    a._x = 10;
    foo(&a, &A::_x);   // and here
}

どうすればそれができますか?を渡し、&A::_x後で(*a_ptr).*m_ptr?を使用して参照します。

私は、&A::_x常に同じアドレスを参照するだろうと思っていましたが、異なるオブジェクトは異なるものを持ってい_xます。

4

1 に答える 1

3

&A::_xポインタではないメンバへのポインタです。むしろ、特定のメンバー要素がオブジェクト内のどこにあるかを示す相対的な種類の構造と考えてください。インスタンス参照と共にのみ、メンバー ポインターによって指定されたそのインスタンスの実際のサブオブジェクトを見つけることができます。

比較:

struct Foo { int x; int y; };

Foo a = { 1, 2 };
Foo b = { 3, 4 };
Foo c = { 5, 6 };

int * p = &a.x;  // ordinary pointer-to-int

int Foo::*pm = &Foo::x;             // pointer-to-member
int result = a.*pm + b.*pm + c.*pm; // aggregate Foo::x
// point to a different member:
pm = &Foo::y;
result = a.*pm + b.*pm + c.*pm;     // aggregate Foo::y
于 2012-08-14T07:58:38.027 に答える