3

次のコードがあります。

class SomeClass {};

class SomeOtherClass {
    SomeClass& someObj;
public:
    SomeOtherClass() {someObj = SomeClass();}
};

そして、コンストラクターでエラーが発生しSomeOtherClassますConstructor for 'SomeOtherClass' must explicitly initialize the reference member 'someObj'

したがって、私の質問はかなりストレートだと思います。参照をどのように初期化しますか?

4

3 に答える 3

9

すぐに破棄される一時オブジェクトへの参照を保存しようとしているため、間違いなく失敗します。他の回答で説明されているコンストラクター初期化リストを使用する場合でも。

参照は、ポインターと同様に、別の場所に格納されているオブジェクトを指す必要があります。この場合、参照を使用する必要さえありますか?

于 2012-07-01T21:22:52.170 に答える
7

コンストラクターの初期化リストの一部として:

SomeOtherClass() : someObj(SomeClass()) {}

更新:これは、すぐに死んでしまう一時オブジェクト インスタンスへの参照になるため、逐語的に使用してはならないものであることを本当に警告する必要がありました。

SomeOtherClassアイデアは上記ですが、構築しているインスタンスの寿命よりも短くない寿命を持つオブジェクトを渡す必要があります。

于 2012-07-01T21:20:17.073 に答える
4

参照には「デフォルト」または「null」の初期化がないため、コンストラクターの初期化リストで初期化する必要があります。

class SomeOtherClass {
    SomeClass& someObj;
public:
    SomeOtherClass(SomeClass& sc) : someObj(sc) {}
};

別の回答で指摘されているように編集します。参照を含むオブジェクトと同じかそれよりも長い寿命を持つオブジェクトに参照が初期化されるように注意する必要があります。sc上記の例では、 がインスタンスよりも長生きすると仮定しSomeOtherClassます。

于 2012-07-01T21:20:36.513 に答える