9

2 つのクラスがあるとします。

class A
{
    int x;
    int y;
};


class B
{
    int z;
    A ref;
};

次のように、B のメンバーへのポインター整数を受け入れる関数もあるとします。

void doSomethingToB(B* object, int B::* val)
{
    if(val)
    {
        std::cout << object.*val;
    }
}

ref内部 Bのメンバーを指す方法はありますか?

のように、int B::* ptr = &(B::ref.x)または似たようなものですか?

4

2 に答える 2

5

この質問は時々聞かれます

「内部構造体」メンバーへのポインターは禁止されていますか?

基本的に、これは C++ 言語の設計における明らかな初期の見落としであると説明できます。これは、言語がより高いレベルの方向に発展するという事実のために、それ以来無視されてきました。データ メンバー型へのポインターのポインターは、十分な注意を払うには低レベルすぎると考えられます。ある日、そのようなポインターがさらに開発されるのではなく、廃止されることを発見しても驚かないでしょう。

リンクされた回答から私の声明を繰り返すと、低レベルのサポートはすべての C++ コンパイラに既に存在します (メンバーがどれだけ深く「ネスト」されているかに関係なく、低レベルのメカニズムは同じであるため、単にメンバーのオフセットです含まれているオブジェクト)、対応する初期化構文がありません。

于 2012-08-06T23:36:07.420 に答える
-1

単純なint*ポインターを使用するだけではありませんか? なぜメンバーポインタである必要があるのですか?

void doSomethingToVal(int * val) 
{ 
    if(val) 
    { 
        std::cout << *val; 
    } 
} 

int *ptr = &(B::ref.x);
doSomethingToVal(ptr) ;
于 2012-08-06T23:28:54.573 に答える