2014-11-05 19 views
1

Win7-64位 cygwin的 克++ -std = GNU ++ 11(4.8.3)你如何初始化構造函數體中的變量而不是定義中的變量?

在可變 '分區' 下面的片段必須在調用slipInit後進行初始化。編譯器會抱怨(哦,非常痛苦),除非我在定義中初始化分區(在':'之後)。我剛開始使用gnu ++ 11,所以這是一個不幸的意外。有沒有簡單的解決方法,或者我必須創建另一種方法來執行初始化?

StringPartition::StringPartition(vector<string*>* vec, long debugFlags) 
           : vec(*vec) 
          , debugFlags(debugFlags) { 
     SlipCellBase::slipInit(SLIPALLOCATION, SLIPALLOCATION); 
     partition = * new SlipHeader(); 
}; // StringPartition::StringPartition() 

Error Message 
error: uninitialized reference member 'StringPartition::partition' [-fpermissive] 
+2

似乎'分區'可能會更好地作爲智能指針而不是參考。 – 2014-11-05 15:06:56

+0

什麼是和如何構建'智能指針'(我只是一個愚蠢的程序員)? – 2014-11-05 15:13:40

+0

閱讀:http://stackoverflow.com/q/106508/10077 C++ 11提供了幾種智能指針類型。最流行的是['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)和['std :: shared_ptr'](http://en.cppreference.com/W/CPP /存儲器/ shared_ptr的)。 – 2014-11-05 15:14:31

回答

2

既然你想初始化reference data member(因爲C++ 11你可以做,在構造函數的初始化列表或用大括號或相等的初始化),但它需要一個函數調用第一,你應該更喜歡smart pointer超過參考(提前僞):

class StringPartition { 
    public: 

    StringPartition() { 
     SlipCellBase::slipInit(SLIPALLOCATION, SLIPALLOCATION); 
     partition.reset(new SlipHeader()); 
    } 

    std::unique_ptr<SlipHeader> partition; 
}; 

在C++ 14 you could even do better

0

不能在構造函數體中「初始化」成員。你只能分配給他們。所有成員都可以初始化 - 使用它們的默認構造函數,並且只有在可能的情況下(否則編譯失敗) - 在構造函數體的執行開始之前。由於partition是參考,所以必須被初始化,並且不能被默認初始化。

您的問題已經出現,因爲SlipCellBase沒有利用RAII,因此不適合類內資源管理的21世紀模型。您的最佳選擇可能是讓partition a std::unique_ptr<SlipHeader>,以便它可以採取「未設置」的值,直到您準備分配給它。當您的StringPartition超出範圍時,std::unique_ptr<>的智能特性將爲您清理它。儘管如此,仍然沒有幻想:這最終還是圍繞着糟糕的設計。

相關問題