2017-01-16 5 views
0

コンストラクタで初期化する必要がある.hファイルで作成されたオブジェクトがあります。このオブジェクトには、現在のアプリケーションでは5のCOMポート番号が渡されます。このため、私は.hファイルにconst intを作成しました。同じコンストラクタ内のconst intとそのconst intを持つオブジェクトを初期化する

編集:私は

class ClassB 
{ 
public: 
    ClassB(int comPort); 
private: 
    int m_comPort; 
}; 

ClassB::ClassB(int comPort) : 
    m_comPort(comPort) 
{ 
} 

class ClassA 
{ 
public: 
    ClassA(); 
private: 
    const int comPort; 
    ClassB B; 
}; 

ClassA::ClassA() : 
    comPort(5), 
    B(comPort) 
{ 
} 

int main() 
{ 
    ClassA A; 
    return 0; 
} 

より完全な例を追加しましたコンポートが完全に初期化される前にオブジェクトが初期化されているので、コンポートの値はゴミです。

これを回避する正しい方法は何でしょうか?私は、次を考えることができます:

  • は、ヘッダファイルでのconst int型を初期化
  • コンストラクタの本体にオブジェクトを作成し、初期化することができますの#define
+3

'comPort'が' B'の前のクラスで定義されている場合、それはガベージではありません。あなたの質問に答えたり、問題を再現するのに十分な情報がここにありません。 – wally

+0

私はより完全な例で謝罪します! – YouKnowNothingJohn

+0

さらに詳しいコード例を追加しました。 – YouKnowNothingJohn

答えて

0

を使用しますcomPortBの宣言をClassAの定義で交換すると、エラーを再現してください。 SOに関するConstructor initialization-list evaluation orderに関するコメントを参照してください。

したがって、イニシャライザのリストが特定の評価順序に依存する場合、初期化されるメンバの宣言はこの順序に準拠している必要があります。

+0

Francoisがコメントで述べたように、私はこれが原因だと信じています! – YouKnowNothingJohn

1

メンバの初期化に問題があるようです。クラスメンバは、と宣言された順にに初期化されます。コンストラクタ内で初期化された順序は、これをオーバーライドしません。次の例では、bar::my_foobar::my_constより前に初期化されているため、問題が発生します。 my_fooはユニット化されたmy_constメンバーで初期化されます。

struct foo { 
    foo(int p_x) : x(p_x) {} 
    int x; 
} 

struct bar { 
    bar() : my_const(5), my_foo(my_const) {} 
    foo my_foo; 
    const int my_const; 
} 

問題は、メンバーが宣言された順序を変更することで修正できます。

struct bar { 
    bar() : my_const(5), my_foo(my_const) {} 
    const int my_const; // my_const before my_foo 
    foo my_foo; 
} 
+0

脆弱なアプローチは、注文にまったく依存しないことです。 'bar(const int var = 5):my_const(var)、my_foo(var){}'は依存関係を取り除きます。 – NathanOliver

関連する問題