初始化类的struct data成员

时间:2010-10-25 13:32:23

标签: c++

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.   
}

3 个答案:

答案 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。,