2010-06-01 130 views
0

讓我們假設你有這樣的類:未定義/未初始化的默認值

class A 
{ 
public: 
    A() {} 
    A (double val) : m_val(val) {} 
    ~A() {} 
private: 
    double m_val; 
}; 

一旦我創建了一個實例,我怎麼能檢查是否m_val已初始化/定義? 換句話說,有沒有辦法知道m_val是否已被初始化/定義?我猜想,Python中的defined運算符是一些東西。 (但是,糾正我,如果我錯了。)

我想修改類和C-職責範圍如下方式:

class A 
{ 
public: 
    A() : defined(false) {} 
    A (double val) : m_val(val), defined(true) {} 
    ~A() {} 
private: 
    double m_val; 
    bool defined; 
}; 

你如何評價這個解決方案?任何建議?

TIA, 克里斯

回答

3

你需要在默認設置一個合理的默認值構造函數,否則其值是未定義的。這基本上意味着它將是一個隨機值 - 可能是0,NaN或2835.23098 - 除非明確設置,否則無法分辨。

class A 
{ 
public: 
    A() : m_val(0.0) {} 
    A (double val) : m_val(val) {} 
    ~A() {} 
private: 
    double m_val; 
}; 
+0

+1對於INITIALISE用默認值 – 2010-06-01 09:38:25

+0

'NaN'會是一個很好的價值對我來說,因爲它是不能設置唯一的價值。 但是,如果它是'NaN',你將如何測試一個變量? – Jir 2010-06-01 09:40:16

+0

@Jir:''定義'isnan()'。編輯:其實現在我不完全確定它在C++中的定義是什麼以及如何定義的(我自己更多地是一個C人員)...您總是可以回退到value!= value,這隻適用於浮動當他們是NaN時, – 2010-06-01 09:43:13

2

IMO你應該只是初始化成員變量中的所有構造函數,至少有一個合理的默認值:

A() : m_val(0.0) {} 
A (double val) : m_val(val) {} 

我沒有看到在保留了垃圾任何好處你的變量的價值(除非你打算把它們當作一個非常粗糙的隨機數生成器 - 只是開玩笑:-)。這些垃圾值和額外的標誌代碼複雜化,並且將始終需要程序員注意避免的錯誤 - 和我們一樣是人,我們的注意力有時滑倒......

+0

好吧,我注意滑倒特別容易! :P 感謝您的評論,我會避免讓值初始化。 – Jir 2010-06-01 11:19:04