2013-03-14 111 views
1
struct OBJECT 
{ 
unsigned int Var1; 
std::string Str1; 
... 
bool YesNo; 
}; 

OBJECT Obj[ 327 ]; 

我很困惑如何将Obj清零。它有几种不同类型的元素。我是否必须将其所有成员设置为0? 喜欢... Obj[0].Str = ""; ?所以问题是,这样做的正确方法是什么?C++清零结构数组?

我尝试:

::memset(&Obj, 0, sizeof(Obj)); 

我不知道如果我做正确...

哦,在那里零出数组任何更快的方法?

+1

sizeof(TYPE)* 327不是对象本身 – 2013-03-14 10:56:29

+0

提供正确的默认构造函数。 – 2013-03-14 10:57:08

+0

@DenisErmolin感谢您的支持。 – CLearner 2013-03-14 10:57:26

回答

9

不要这样做,因为你的结构中有不平凡的成员(例如std::string)。如果您的所有成员都是简单数据类型,如int,char,double或指针,则可以执行此操作。

这种类型结构的正确方法是定义一个构造函数,它初始化所有成员正确

struct OBJECT { 
    OBJECT() : Var1(0), YesNo(false), ... {} 

    unsigned int Var1; 
    std::string Str1; 
    ... 
    bool YesNo; 
}; 
+0

好的,谢谢:) – CLearner 2013-03-14 11:00:38

+0

虽然这个想法有一个缺点, :在添加新成员时,很容易忘记更新构造函数,而* memset /std∷fill*方法不需要更新。 – 2016-04-26 07:04:18

+1

@ Hi-Angel是的,只要你只有微不足道的成员,你是对的。尽管更复杂的成员,memset甚至可能是危险的,因为它会压倒成员的记忆。请参阅http:// stackoverflow。com/q/2099692/1741542讨论未初始化的成员变量。 – 2016-04-26 07:20:52

3

“正确”的方法是添加一个构造方法,你的结构是初始化任何成员变量没有自己的,如构造函数:

OBJECT_STRUCT() 
: Var1(0) 
, YesNo(false) 
{ 
} 

在那个例子中,你会注意到, Str1未初始化;这是因为std::string有它自己的构造函数来初始化它。

1

要么提供自定义的默认构造函数或使用编译器定义的默认构造函数:

std::fill(std::begin(Obj), std::end(Obj), OBJECT()); 

请注意,如果您使用默认的构造函数fill方法只填写工作。

1

您应该将声明改为

struct OBJECT 
{ 
    unsigned int Var1; 
    std::string Str1; 
    ... 
    bool YesNo; 

    OBJECT() 
    : Var1() 
    , Str1() 
    , ... 
    , YesNo(false) 
    { 
     // Do Nothing 
    } 
}; 

的阵列 - 这你应该使用通过std::arraystd::vector - 将初始化对象。