2013-09-30 95 views
0

我正在使用例程初始化一個類的聚合體成員。通過例程初始化聚合體

class MyClass 
{ 
public: 
    void Init() 
    { 
     double array2D[10][10] = {0.0}; 
     bool logicalarray[2] = {false}; 
    } 

private: 
    double array2D[10][10]; 
    bool logicalarray[2]; 
}; 

int main() 
{ 
    MyClass* myClassObject = new MyClass(); 
    myClassObject->Init(); 

    delete myClassObject; 
    return 0; 
} 

這有什麼不對嗎?它編譯,構建並運行良好。在調試時,我確實看到每個數組元素都是按照我在Init()中定義的方式進行初始化的。但是,代碼清理工具報告在Init()中,已命名的變量已聲明但未被引用。

PS:沒有C++ 11

+0

[this](http://stackoverflow.com/questions/10694689/how-to-initialize-an-array-in-c-objects)可能很有用 – streppel

+0

你目前正在做什麼創建* new *數組'Init'會在'Init'的持續時間內影響類成員,然後超出範圍。你的代碼不*初始化類成員。 – us2012

+0

重新編輯:我的答案不依賴於C++ 11。 –

回答

1

代碼清理工具是正確的。此代碼不會做你認爲它的作用:

void Init() 
    { 
     double array2D[10][10] = {0.0}; 
     bool logicalarray[2] = {false}; 
    } 

認爲這個代碼初始化MyClass的成員變量。它實際上做的是聲明兩個本地(自動)變量,初始化它們,然後返回。成員變量沒有被觸及,並在Init()的身體內hidden

您可以通過解決這個問題:

void Init() 
    { 
     array2D[10][10] = {0.0}; 
     logicalarray[2] = {false}; 
    } 

但我認爲,這在技術上是正確的,但仍然是錯誤的。你正在使用所謂的兩相結構。這兩個階段是:1)構建一個MyObject。 2)通過調用它的Init()函數初始化MyObject

醜。討厭。容易出錯&忘記。語義錯誤,因爲構造函數不是使對象保持完全初始化狀態。作爲一般規則,您應該不惜一切代價避免兩階段建設。更好的方法是在對象的構造函數中執行所有初始化 - 最好在成員初始化列表中進行,但對於聚合成員來說,這是很難/不可能的。在這種情況下,初始化在構造函數的身體:

class MyClass 
{ 
public: 
    MyClass() 
    { 
    array2D[10][10] = {0.0}; 
    logicalarray[2] = {false}; 
    } 
    // ... 
}; 

現在,MyObject的建設也意味着初始化MyObject。畢竟,這就是構造函數的用途。相反。

這裏的問題是我們不能像這樣初始化聚集。我們只能在構建時使用這種語法來初始化一個聚合,但發生在(不存在的)初始化列表中。我們不能在C++ 03中使用初始化列表來初始化聚合。所以,你留下了一個醜陋的情況:

MyClass() 
{ 
    memset (logicalarray, logicalarray+2, 0); 
    memset (array2D, array2D+sizeof (array2D), 0); 
} 

這使我認爲你不應該擺在首位使用原始陣列進行爭論,而是一個vector(或東西),並通過一些初始化像:

class MyClass 
    { 
    public: 
     std::vector <bool> mBools; 
     std::vector <std::vector <double> > mDoubles; 
     MyClass() 
     { 
     std::fill_n (std::back_inserter (mBools), 2, false); 
     } 
    }; 

我會留下的mDoubles初始化練習。

+0

你可以正確地做'{}'嗎? –

+0

@NeilKirk:澄清。而不是什麼? –

+0

'{0.0}'和'{false}'它應該默認爲0等效值。 –