2017-01-16 42 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; 
} 

由於COMPORT之前被初始化對象被完全初始化,爲相稱的值是垃圾。

避免這種情況的正確方法是什麼?我能想到以下幾點:

  • 初始化的const int的頭文件
  • 創建和初始化對象的構造
  • 的身體使用的#define
+3

如果'comPort'是在'B'之前的類中定義的,那麼它不會是垃圾。沒有足夠的信息來回答您的問題或重現問題。 – wally

+0

我會編一個更完整的例子,道歉! – YouKnowNothingJohn

+0

添加了更詳細的代碼示例。 – YouKnowNothingJohn

回答

0

你可以如果您在ClassA的定義中交換comPortB的聲明,則重現您的錯誤。請參閱有關Constructor initialization-list evaluation order的此評論。

因此,請確保如果初始化程序列表依賴於特定的評估順序,則要初始化的成員聲明必須遵守此順序。

+0

弗朗索瓦在評論中提到,我相信這是罪魁禍首! – 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

相關問題