-2

次のコードに出くわしましたが、次の概念の重要性を理解できません。助けてください 。

#include <iostream>
using namespace std;

class cl 
{

public:
    cl(int i) { val=i; }
    int val;
    int double_val() { return val+val; }

};

int main()
{
    int cl::*data; // data member pointer
    int (cl::*func)(); // function member pointer
    cl ob1(1), ob2(2); // create objects
    cl *p1, *p2;
    p1 = &ob1; // access objects through a pointer
    p2 = &ob2;
    data = &cl::val; // get offset of val
    func = &cl::double_val; // get offset of double_val()
    cout << "Here are values: ";
    cout << p1->*data << " " << p2->*data << "\n";
    cout << "Here they are doubled: ";

    cout << (p1->*func)() << " ";
    cout << (p2->*func)() << "\n";
    return 0;
}
4

1 に答える 1

4

メンバーへのポインターは、オブジェクトに関係なく、必要なクラスのメンバーについてのみ通知する C++ の特別なガジェットです。データまたは関数メンバーのいずれであっても、実際のメンバーを取得するには、メンバーへのポインターをオブジェクト インスタンスと組み合わせる必要があります。

メンバーへのポインターを「オフセット」と考えてください。また、メンバーへのポインターはポインターではないことに注意してください。

コードを書き直して、少しわかりやすくすることができます。

struct Foo
{
    int a;
    int b;
    double f(int, int);
    double g(int, int);
};

int main()
{
    int Foo::*ptm = &Foo::a;
    double (Foo::*ptmf)(int, int) = &Foo::f;

    Foo x, y, z;

    int numbers[] = { x.*ptm, y.*ptm, z.*ptm }; // array of Foo::a's

    ptm = &Foo::b;                              // reseat the PTM

    int more[] = { x.*ptm, y.*ptm, z.*ptm };    // array of Foo::b's


    double yetmore[] = { (x.*ptmf)(1,2), (y.*ptmf)(1,2) };

    ptmf = &Foo::g;

    double evenmore[] = { (x.*ptmf)(1,2), (y.*ptmf)(1,2) };
}

メンバーへのポインターを使用してクラスメンバーのみを参照する方法に注意してください。これを使用して、異なるオブジェクトから同じ相対クラスメンバーを取得できます。

(対照的に、実際のオブジェクト メンバーへの実際のポインターを作成することint * p = &x.a;できintます: ))

クラスとオブジェクトの違いを理解していることを確認してください。これは非常に明確になるはずです。

于 2012-11-27T13:56:17.190 に答える