Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将结构数组归零?_C++ - Fatal编程技术网

C++ C++;将结构数组归零?

C++ C++;将结构数组归零?,c++,C++,我对如何将Obj归零感到困惑。它有几种不同类型的元素。是否必须将其所有成员设置为0? 像Obj[0].Str=“” ? 所以问题是,正确的做法是什么 我的尝试: struct OBJECT { unsigned int Var1; std::string Str1; ... bool YesNo; }; OBJECT Obj[ 327 ]; 我不确定我做的是否正确 哦,还有没有更快的方法将数组归零?正确的方法是为您的结构添加一个构造函数方法,该方法初始化没有自己构造函数的任何成员变量,例如:

我对如何将Obj归零感到困惑。它有几种不同类型的元素。是否必须将其所有成员设置为0? 像<代码>Obj[0].Str=“” ? 所以问题是,正确的做法是什么

我的尝试:

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

OBJECT Obj[ 327 ];
我不确定我做的是否正确

哦,还有没有更快的方法将数组归零?

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

::memset( &Obj, 0, sizeof( Obj ) );
在该示例中,您将注意到,
Str1
未初始化;这是因为
std::string
有自己的构造函数对其进行初始化。

正确的方法是为您的结构添加一个构造函数方法,用于初始化任何没有自己构造函数的成员变量,例如:

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

在该示例中,您将注意到,
Str1
未初始化;这是因为
std::string
有自己的构造函数对其进行初始化。

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

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

请注意,
fill
方法fill仅在使用默认构造函数时有效。

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

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

请注意,
fill
方法fill仅在使用默认构造函数时有效。

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

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

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

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

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

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

你应该把你的声明改为

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

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

您应该在
std::array
std::vector
上使用的数组将初始化对象。

您应该将声明更改为

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

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

数组-您应该在
std::array
std::vector
上使用它-将初始化对象。

sizeof(TYPE)*327 not object itself提供正确的默认构造函数。@DenisErmolin感谢您捕捉到了这一点。我非常确定您的许多对象没有简单的副本/默认构造函数。一个
memset
不是办法。@Jon不<代码>标准::字符串如果您将其设置为0,它将死机!sizeof(TYPE)*327 not object itself提供正确的默认构造函数。@DenisErmolin感谢您捕捉到了这一点。我非常确定您的许多对象没有简单的副本/默认构造函数。一个
memset
不是办法。@Jon不<代码>标准::字符串如果您将其设置为0,它将死机!但这种想法有一个缺点:在添加新成员时,很容易忘记更新构造函数,而memset/std∷填充方式不需要更新。@Hi Angel是的,只要您只有微不足道的成员,您就是对的。但对于更复杂的成员,
memset
甚至可能是危险的,因为它会践踏成员的内存。有关未初始化成员变量的讨论,请参阅。@OlafDietsche感谢您的建议;我试过了,但我不得不说,似乎没有一个好方法可以确定地找到单位化变量<代码>-Weffc++选项给出数百个错误警告,valgrind仅在运行时有用,而我正在使用运行时在嵌入式设备中的应用程序。也许cppcheck对此有用-不确定,我没有尝试过那个特定的问题。@Hi Angel我自己也没有尝试过这些,所以无法真正发表评论。快速检查显示,
-Weffc++
和cppcheck似乎都不太可靠<代码>-Weffc++即使在有非POD类型的默认构造函数时也会抱怨,而在没有定义构造函数时,它根本不会抱怨。cppcheck根本不显示任何警告。也许更新的版本更好。但是这个想法有一个缺点:在添加新成员时,很容易忘记更新构造函数,而memset/std∷填充方式不需要更新。@Hi Angel是的,只要您只有微不足道的成员,您就是对的。但对于更复杂的成员,
memset
甚至可能是危险的,因为它会践踏成员的内存。有关未初始化成员变量的讨论,请参阅。@OlafDietsche感谢您的建议;我试过了,但我不得不说,似乎没有一个好方法可以确定地找到单位化变量<代码>-Weffc++选项给出数百个错误警告,valgrind仅在运行时有用,而我正在使用运行时在嵌入式设备中的应用程序。也许cppcheck对此有用-不确定,我没有尝试过那个特定的问题。@Hi Angel我自己也没有尝试过这些,所以无法真正发表评论。快速检查显示,
-Weffc++
和cppcheck似乎都不太可靠<代码>-Weffc++即使在有非POD类型的默认构造函数时也会抱怨,而在没有定义构造函数时,它根本不会抱怨。cppcheck根本不显示任何警告。也许更新的版本更好。