2

動的に割り当てられた構造で参照を初期化する方法を知っている人はいますか?またはなぜこれが機能しないのですか?

#include <stdio.h>
#include <stdlib.h>

class A
{

};

struct S
{
    A& a;
};

int main()
{
    A a;

    S* s=new S;
    s->a=a;

    printf("a addr:%p\n", &a);
    printf("s->a addr:%p\n", &(s->a));
delete s;
    return 0;
}

出力:

a addr:0x7fff95b65aaf
s->a addr:(nil)
4

2 に答える 2

3

コンストラクターの初期化子リスト内で参照メンバーを初期化する必要があります。メンバーはすでに初期化されており、変更できないため、コンストラクターの本体でさえ手遅れです。

コードでは、(コンパイラーが提供する)デフォルトのコンストラクターを使用しており、オブジェクトが構築された後に参照を設定しようとしています。

これを試して:

struct S
{
    S(A& a_) : a(a_){} 
    A& a;
};

int main()
{
    A a;

    S* s=new S(a);
...
于 2012-07-18T16:45:31.403 に答える
2

参照メンバーに何かを割り当てようとしているため、機能しません(もちろん、参照自体には影響しませんが、参照オブジェクトに影響します)。コード内の参照を初期化していない。参照は「生まれた」瞬間にのみ初期化でき、後で初期化を延期することはできません。

を実行new Sすると、コンパイラーが生成したデフォルトのコンストラクターを使用するようにコンパイラーに要求しますSSコンパイラは参照メンバーを初期化する方法を知らないため、のデフォルトコンストラクタを生成できませんa。C ++の参照は、初期化されないままにすることはできず、デフォルトで初期化することも、値を初期化することもできません。特定の初期化子は常に明示的に指定する必要があります。

残念ながら、C ++ 89 / C ++ 03では、struct S(コードで定義されているように)動的に割り当てられた場合にそれを行う方法はありません。このために独自のコンストラクターを提供する必要があります。

C ++ 11では、統一された初期化構文を使用できます

S *s = new S { a };

S::aこれにより、新しく割り当てられたオブジェクトのメンバーがにアタッチされaます。

于 2012-07-18T16:50:28.210 に答える