2010-10-31 70 views
2

我看遍了所有的地方,但還沒有找到答案。Basic C++:我如何初始化一個類的struct成員?

我與這些受保護的成員的C++類:

struct tm _creationDate; 
struct tm _expirationDate; 
struct tm _lockDate; 

我想在實例化時初始化它們。如果我把這個在構造函數中:

_creationDate = {0}; 
_expirationDate = {0}; 
_lockDate = {0}; 

編譯器會抱怨:「預期主表達式前‘{’令牌」

我還不能找到一個方法來做到這一點的一個成員初始化列表在構造函數的頂部。如何做到這一點?謝謝!

後續: 感謝您的回覆,夥計們。你不能在聲明中這樣做;這是不允許的。因此,唯一的方法似乎是memset或單獨設置成員。我最終寫了一個實用函數來做到這一點。

回答

2

您可以做他們在聲明中這樣

_creationDate = {0}; // set everything to 0's 

或類似這樣的

_creationDate = { StructElement1, StructElement2, ..., StructElement n); 

_creationDate = { 0, false, 44.2); 

或者在構造函數只是調用每個元素在結構和初始化,如...

_creationData.thing1 = 0; 
_creationData.thing2 = false; 
_creationData.thing3 = 66.3; 
+2

謝謝。只有最後一個選項適用於C++對象;成員不允許帶大括號的初始化器。 – Oscar 2010-11-01 00:20:35

1

我認爲當你定義它,你只能初始化結構類似:

struct tm a = {0}; // works ok 
struct tm b; 
b = {0};   // error 

一種選擇是要麼使用「默認」值

class a 
{ 
    a() : t() {} 
    struct tm t; 
}; 
在構造

或者memset

struct tm creationDate; 
memset((void*)&creationDate, 0, sizeof(struct tm)); 
0

只有在C++ 03可能的方式:

class foo 
{ 
    tm _creationDate; 
    public: 
    foo() 
    { 
     tm tmp_tm = {0}; 
     _creationDate = tmp_tm; 
    } 
}; 

注意,這將初始化_creationDatetmp_tm副本,從而調用(最有可能自動生成)拷貝構造函數。因此,對於大型結構,您應該堅持使用實用函數,因爲這不需要複製整個結構。

順便說一句,不應該使用以下劃線開頭的名稱,因爲它們被保留用於實現標準庫(用於內部使用),所以這可能會導致名稱衝突或其他不良行爲。