2010-10-25 70 views
2
typedef struct _MY_STRUCT 

{ 

     std::string  mystring;   
     int    n1; 
     int    n2; 
} MY_STRUCT; 

class foo 

{ 

public: 

    foo(): 
     m_mystruct() 
{ } 

private: 

    MY_STRUCT m_mystruct; 
}; 

int main(void) 

{ 

    foo oFoo;    
    // Why doesnt this intialize all data members of foo to NULL/0. 
    // what is the correct way to get all members of MY_STRUCT to be intialized to NULL/0. 
} 

回答

2

你可以做的只是增加一個構造函數來你的結構定義:

typedef struct _MY_STRUCT 

{ 
    _MY_STRUCT() 
    { 
     n1 = 0; 
     n2 = 0; 
    } 
    std::string  mystring;   
    int    n1; 
    int    n2; 
} MY_STRUCT; 
+0

還有其他的方法可以做到這一點,但是這是不夠好現在。 – 2010-10-25 13:37:39

+0

也可以初始化'mystring'。 – Arun 2010-10-26 04:22:49

8

首先,你不需要做typedef像這樣的C++。其次,創建一個默認的構造函數的結構:

struct MY_STRUCT 
{ 
    std::string mystring; 
    int n1; 
    int n2; 

    MY_STRUCT() : mystring(), n1(), n2() {} 
}; 

這樣的結構成員將默認初始化爲:

  • std::string空字符串(通過其默認的構造函數),
  • int s歸零。

所以下面的成立:

MY_STRUCT ms; 
assert(ms.mystring.empty()); 
assert(ms.n1 == 0); 
assert(ms.n2 == 0); 
0

的原因最可能是你使用Visual C++。即使從版本10.0開始,Visual C++也不會正確執行值初始化。你的代碼在g ++ 4.4.1中可以正常工作。

2005年左右,Visual C++並沒有達到標準,這是可以理解的,因爲在C++ 03中C++ 98的初始化規則發生了變化。這是C++ 03中唯一的語言改變,否則這只是C++ 98的「技術勘誤」(C++ 03有時被稱爲TC1,技術勘誤1)。 C++ 03引入了「值初始化」作爲「默認初始化」的泛化,以便使結果更簡單,更簡單,並且對於像你的聚合類,包含POD和非POD成員的類更加實用:with C++ 03規定這些成員都是零初始化或默認初始化,所有這些成員。這是一件非常好的事情。 T'was是Andrew Koenig,他提出這個建議,IIRC,並且因爲Koenig Lookup(a.k.a.ADL,Argument Dependent Lookup)而受到指責。 :-)

但是從2010年開始,Visual C++不能正確地做到這一點是不太可以理解的。

這就是說,你的代碼太可怕了。 :-)

請參閱其他意見以改進代碼,包括定義構造函數的想法,這將解決Visual C++的問題。

乾杯&心連心,

+0

@anonymous downvoter:請解釋你的downvote;它看起來特別聰明。很可能你不熟悉數值初始化。我建議你看看。 – 2014-08-02 01:27:39