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

OBJECT Obj[ 327 ];

Obj をゼロにする方法について混乱しています。いくつかの異なるタイプの要素があります。すべてのメンバーを 0 に設定する必要がありますか? のように... Obj[0].Str = ""; ?それで問題は、それを行う適切な方法は何ですか?

私の試み:

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

やり方が正しいのか自信がありません...

ああ、配列をゼロにするより速い方法はありますか?

4

4 に答える 4

10

構造体に重要なメンバーが含まれているため、このようにしないでください(例std::string)。これは、すべてのメンバーが、、、またはポインターなどの単純なデータ型のみである場合に実行できますintchardouble

このタイプの構造体の正しい方法は、すべてのメンバーを適切に初期化するコンストラクターを定義することです。

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

    unsigned int Var1;
    std::string Str1;
    ...
    bool YesNo;
};
于 2013-03-14T10:59:25.347 に答える
3

「正しい」方法は、独自のコンストラクターを持たないメンバー変数を初期化する構造体のコンストラクターメソッドを追加することです。例:

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

Str1その例では、それが初期化されていないことに気付くでしょう。これは、std::stringそれを初期化する独自のコンストラクターがあるためです。

于 2013-03-14T10:58:21.570 に答える
3

カスタムのデフォルトコンストラクターを提供するか、コンパイラー定義のデフォルトコンストラクターを使用します。

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

fillアプローチフィルは、デフォルトのコンストラクターを使用する場合にのみ機能することに注意してください。

于 2013-03-14T10:59:02.430 に答える
1

宣言を次のように変更する必要があります

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

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

配列(std::arrayまたは上で使用する必要がありますstd::vector)は、オブジェクトを初期化します。

于 2013-03-14T10:59:37.680 に答える