0

メンバーへのポインターを使用して複合クラス データ メンバーにアクセスすることは可能ですか? 次のコードは有効ではありませんが、その必要性を示しています。

例えば:

class A
{
public:
    float fA;
};

class B
{
public:
    float fB;
    A a;
};

void test()
{
    // Use of member pointer to access B::fB member
    float B::*ptr = &B::fB; // -> OK
    B myB;
    myB.*ptr = 25.;

    // Use of member pointer to access B::a.fA member ???
    float B::*ptr2 = &B::a.fA; // -> ERROR
    B myB.*ptr2 = 25.;
}

ここで質問を完了しました:複合クラス データ メンバーへのポインター - パート 2

4

4 に答える 4

0

ここでの明らかな「理由」は、fAが のメンバーではない ためですB。この特定のケースでは、それを実装しても、直交性ルールの両方で特定の問題が発生することはおそらくなく、メンバー関数については、実装できないと思います。

もちろん、できることは、 のA メンバーのアドレスをB取得して、それをfA通過することです。

A B::*ptr = &B::a;
(myB.*ptr).fa = 25.;

、 例えば。(括弧が必要かどうかはわかりません。頭の中で優先順位を付けるほど頻繁に使用する構文ではありません。)

于 2013-04-08T12:53:27.857 に答える
0

いいえ、C++ 構文で許可されていないため、できません。あなたがやろうとしていることについて本当に特別なことは何も見当たりませんが、それは単に言語で考慮されていません.

ただし、データ メンバーへのポインターは、特定のインスタンスが特定のデータ メンバーへの参照を返すオブジェクトであることに注意してください。この機能を手動で実装して、制限を緩和できます。

struct A
{
    double x;
    double y;
    static double& x_of(void *p) { return ((A *)p)->x; }
    static double& y_of(void *p) { return ((A *)p)->y; }
};

struct B
{
    double z;
    A a;
    static double& x_of(void *p) { return ((B *)p)->a.x; }
    static double& y_of(void *p) { return ((B *)p)->a.y; }
    static double& z_of(void *p) { return ((B *)p)->z; }
};

ポインターの型はdouble& (*)(void *)単純であり、たとえば配列の要素をメンバーとして返す場合でも、この種のトリックを使用できます。

于 2013-04-08T17:29:32.300 に答える
0

私はコメンターに同意します。おそらく、あなたが望むことを行うと思うことを行う方法ではなく、やりたいことを行う方法を尋ねる必要があります:)

質問については、いいえ、この方法ではアクセスできませんB::a.fA。ただし、次の操作を実行できます。

A myA;
float A::*ptr2 = &A::fA; // -> OK now
myB.a.*ptr2 = 25.;

または、次のようにします。

A B::*ptr3 = &B::a; 
(myB.*ptr3).fA = 1.0f;  // -> OK too
于 2013-04-08T12:54:26.787 に答える