2010-10-25 31 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