2011-12-15 11 views
2

クラスコンストラクタの初期化リストから参照オブジェクトを初期化しようとしていますが、次のように初期化できない理由が入力されています。次のように参照を初期化することはできませんか?C++参照変数の初期化リスト

class ObjectA 
{ 

private: 
    char* _nameA; 
    int _velocityA; 

public: 
     ObjectA(char* name, int velocity) 
     { 
      name = name; 
      _velocityA = velocity; 
     } 
}; 

私はまさに私がなぜタイプの参照「をObjectA &」(const修飾ではないが)タイプ「のchar *」の値で初期化することができないと言い、次の初期化リストでエラーが出ますこのエラーが発生していますか?私は何が間違っていますか?

class ObjectB 
{ 

private: 
    ObjectA& objA; 

public: 
     ObjectB(char* engName, int _velocityA):objA(engName, _velocityA) 
     { 
     } 
}; 
+1

なぜ参考になるのですか? – kennytm

+0

'ObjectA'ではなく' ObjectA 'であれば ':objA(ObjectA(engName、_velocityA))'を使うべきですが、 'objA'は参照です。 RValue – PeterT

+1

既に、ObjectAがクラスの外部のオブジェクトを指し示すメンバーchar *を持つという事実は、ObjectAインスタンスが自己完結型でないため、後で問題を引き起こす可能性があります。 –

答えて

2

問題は、あなたがオブジェクトを作成するのと同じ方法で参照objAを初期化しようとしています。

ObjectB(char* engName, int _velocityA):objA(engName, _velocityA) 
    { 
    } 

objAを覚えobjA(engName, _velocityA)ObjectAのコンストラクタを呼び出すなるように参照ではなく、ポインタまたは変数です。

ObjectBのコンストラクタは、参照としてobjAを参照できるように、ObjectAオブジェクトをパラメータとして使用する必要があります。

class ObjectB 
{ 

private: 
ObjectA& objA; 

public: 
    ObjectB(ObjectA & a):objA(a) 
    { 
    } 
}; 

int main() 
{ 
    ObjectA a("hello", 10); 
    ObjectB *b = new ObjectB(a) ; 

} 
3

ここでやろうとしていることは意味をなさない。新しく作成されたオブジェクトで参照を初期化しようとしています。参照は、の既存のオブジェクトを指し示す必要があります。あなたが持っていない場合、参照はあなたが望むものではないかもしれません。

は、より多くの情報のため、この質問を参照してください:Initialization of reference member requires a temporary variable C++

関連する問題