2009-01-05 72 views
2

我有以下的使用情況下,一些布爾一個struct和int變量具有布爾型字段默認初始化的結構?

struct a { 

    int field1; 
    bool field2; 
    bool field3; 

}; 

我重構這個代碼,寫一個構造的結構,問題是字段的默認初始化。

這裏我不批評任何語言結構,但最好我想空是語言本身

我的意思是我應該能夠爲結構一個定義爲

a : field1(null.int), field2(null.bool), field3(null.bool) {} 

的C部分++不允許它,因爲null.int或null.bool沒有定義。在C做的唯一途徑++是

a: field1(-1), field2(false), field3(false) {} 

回答

9

你可以做

struct a { 
    a():field1(), field2(), field3() { } 
    int field1; 
    bool field2; 
    bool field3; 
}; 

而且所有字段將分別爲零和虛假。如果你想說領域有一個不確定的價值,恐怕你必須使用其他技術。一種是使用boost::optional

struct a { 
    a():field1(int()), field2(bool()) { } 
    optional<int> field1; 
    optional<bool> field2; 
    optional<bool> field3; 
}; 

葉field3不確定。通過*field_name訪問值。用field == boost::noneif(field) { ... }測試無值。

3

一個布爾值有兩個狀態。這就是它的一個布爾值。因此,在任何強類型語言中,布爾值是真或假。

c/C++(和java)中的整數是數字的直接二進制表示形式。您可以指定該數字的一個值來表示「該數字沒有任何價值」,但這在所有情況下都沒有意義 - 並且如果語言考慮到了這一點,則每個數學操作都必須在檢查之前進行 - 這真的會減慢速度。

底線:如果您想要弱型系統,請使用其他語言。

2

您似乎希望能夠說這些字段處於未定義狀態。

這違背了強類型語言(如C++)的原則,所以你運氣不好。
如果你想檢查是否有東西被定義,你需要自己明確地跟蹤它。你可能會使用指針來解決你的問題,但我個人認爲這不是一個好主意。

也許如果您試圖解釋您正在嘗試解決的實際問題,我們可以提供更好的建議。

4

如果您正在查找值爲{true,false,null}的類型,則該類型不是bool。但是,boost::optional<bool>就是這樣一種類型。同樣,boost::optional<int>可以包含任何int,或者根本不包含int。

1

這是C++的方式不支付任何你不使用和默認初始化,並有未初始化的布爾的能力是什麼,很多人將不再需要。

如果你真的想要這種行爲,你可以建立一個你正在使用的類型的可空版本。沿線 東西:所以它適用於多種類型的開箱

class NullBool { 
    bool m_null; 
    bool m_value; 
    public: 
    NullBool() : m_null(true) {} 
    NullBool(bool value) : m_null(false), m_value(value) {} 
    void isNull() const { 
    return m_null; 
    } 
    void value() const { 
    return m_value; 
    } 
    ... 
    // lots of operations 
    ... 
}; 

這可能應該建成一個模板。因爲它是你自己的類型,所以你可以很容易地使默認的構造函數默認爲空。

+0

該模板將... boost:可選? – xtofl 2009-01-05 13:42:33