5

次のコードを検討してください。

class Foo {
    Foo() {}
};

class Bar {
    Foo &Foo_ref;
    Bar() : Foo_ref() {}
};

そのままコンパイルすると、次のエラーが表示されます。

tmp.cc: コンストラクター Bar::Bar() 内:
tmp.cc:7: エラー: 参照型を持つ Foo& Bar::Foo_ref の値の初期化

考えられるあらゆるバリエーションを試しました。私は何を間違っていますか?参照メンバーを新しいインスタンスに初期化するにはどうすればよいですか? 今のところ、回避策として参照の代わりに const ポインターを使用していますが、参照を使用することをお勧めします。

4

3 に答える 3

7

参照は常にオブジェクトにバインドする必要があります。コンストラクターで参照したいオブジェクトを渡す必要があります

Bar(Foo &foo) : Foo_ref(foo)
{
}

Fooコンストラクターに渡したくない(または渡せない)Bar場合は、ポインターを使用する必要があります。

class Bar {
    Foo *Foo_ptr;
    Bar() : Foo_ptr(nullptr) {}
};

参照メンバー変数は、初期化子リストにバインドする必要があるポインターと考えることができます

于 2012-07-05T05:53:51.663 に答える
5

どうしたの

class Bar
{
    Foo myFoo;
    Bar() : myFoo() {}
};

まったく新しい Foo オブジェクトが必要ですか?

于 2012-07-05T06:00:08.790 に答える
1

コンストラクターは、パラメーターを受け取るか、参照の前に初期化されるメンバーへの参照を設定するか、グローバルFooオブジェクトへの参照を設定する必要があります。参照を一時的なものにバインドすることはできません(参照がである場合でもconst、コンストラクターが終了するまでしか存続しません。

extern Foo gFoo;

class Bar {
    Foo foo;
    Foo &Foo_ref;
    Bar() : Foo_ref(gFoo) {}
    //or
    //Bar() : Foo_ref(foo) {}
    Bar(Foo& foo) : Foo_ref(foo) {}
};
于 2012-07-05T05:56:09.320 に答える