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.
}
答案 0 :(得分:8)
首先,您不需要在C ++中执行typedef
这样的操作。其次,为您的结构创建一个默认构造函数:
struct MY_STRUCT
{
std::string mystring;
int n1;
int n2;
MY_STRUCT() : mystring(), n1(), n2() {}
};
这样,结构成员将默认初始化为:
std::string
清空字符串(通过其默认构造函数),int
为零。以下是:
MY_STRUCT ms;
assert( ms.mystring.empty());
assert( ms.n1 == 0 );
assert( ms.n2 == 0 );
答案 1 :(得分:2)
您可以只在构造定义中添加构造函数:
typedef struct _MY_STRUCT
{
_MY_STRUCT()
{
n1 = 0;
n2 = 0;
}
std::string mystring;
int n1;
int n2;
} MY_STRUCT;
答案 2 :(得分:0)
原因很可能是您使用的是Visual C ++。即使从版本10.0开始,Visual C ++也没有正确地进行值初始化。您的代码适用于g ++ 4.4.1。
2005年左右,Visual C ++并不完全可以理解,因为初始化的C ++ 98规则在C ++ 03中有所改变。这是C ++ 03中唯一的语言变化,否则它只是C ++ 98的“技术勘误”(C ++ 03有时称为TC1,技术勘误1)。 C ++ 03引入了“值初始化”作为“默认初始化”的一般化,为了使结果不那么随意而且不那么令人困惑,对于像你这样的聚合类,包含POD和非POD成员的类更加实用: C ++ 03规定那些成员是零初始化或默认初始化,所有这些成员。这是一件非常好的事情。 T'是安德鲁·科尼希(Andrew Koenig)提出这个,IIRC,并且它因为他对科尼希查理(K.a.ADL,Argument Dependent Lookup)的责任而受到重视。 : - )
但截至2010年,Visual C ++无法正确执行此操作也不太可理解。
那就是说,你的代码太可怕了。 : - )
请参阅其他注释以改进代码,包括定义构造函数的想法,这将解决Visual C ++的问题。
干杯&第h。,