2016-07-12 10 views
-1

クラスAのconst値を使用してクラスBを初期化しますか?私はそうのように、クラスAからconstの値を使用して、クラスBを構築するにはどうすればよい

class A 
{ 
public: 
    A(); 
private: 
    B b_; 
    const float PARAM_ = 7.7; 
} 

class B 
{ 
    B(float param); 
} 

A::A() : b_(PARAM_) 
{ 

} 

私はB_が作成した代わりに7.7を期待されている場合、上記PARAMにゴミ値を取得しています。正しい方法は何ですか?

+3

[mcve]してください。 – juanchopanza

+0

'PARAM_'の' b_' *の後ろに*の定義を入れますか? – immibis

答えて

1

問題は、C++では非静的メンバーが宣言の順番で初期化されることです。 b_PARAM_の前に宣言されているので、メンバー初期化リストにと書くと、ごみ値で初期化され、となります。PARAM_は7.7に初期化されます。それを避けるには、b_の前にPARAM_の宣言を移動してください。

+0

それは本当ですが、(他のオプションがない限り)宣言の順序に依存するコードを書くべきではありません。それは非常に間違ったプログラミングの練習です。少なくとも彼らは私に教えているものです:)。 – Lehu

+0

作品はありますが、私は本当にその解決策が嫌いです。 :-( – Danijel

+0

@Danijel 'PARAM_'の値が別のコンストラクタによって別の値に設定されることを意図していない場合は、別の答えが示すように、おそらく' static'であるべきです。 –

0

あなたの用途に合っていれば、静的にすることができます。 問題は、非constバージョンのパラメータがbのコンストラクタで使用しようとするまでに初期化されていないために発生します。

静的であるため、先に初期化されます。

関連する問題