c++複雑な構造体の初期化

1457 ワード

最近、コード定義構造体を書く際に初期化の問題が発生し、c++11に対して以下の方法で初期化できることが分かった.
1.構造体を定義するときに直接値を付ける
構造体配列の定義時に直接値を割り当てて初期化
typedef struct SScrollViewItem {
	NcString* iconPath = NULL;
	uint32 itemMsgId = 0;
	BOOL isSelected = FALSE;
	BOOL Disable = FALSE;
 } SScrollViewItem;

2.コンストラクション関数の初期化
c++構造体には、構造関数、メンバー関数などがあり、上記の構造関数ではmemsetで初期化することもできます.
typedef struct SScrollViewItem {
	NcString* iconPath = NULL;
	uint32 itemMsgId = 0;
	BOOL isSelected = FALSE;
	BOOL Disable = FALSE;
	
	SScrollViewItem() {
		memset(this, 0, sizeof(*this));
	}
 } SScrollViewItem;

しかし、この方法は変数、配列、vectorコンテナなどのネストされた複雑な構造体に対して、以下のようにエラーが発生しやすい.
typedef struct tagDataInfo {
    long offs;                //   
    char name[20];            //   
    std::list ord_list;  //       
    std::map<:string std::string=""> str_map; //       
} DataInfo;

正しく初期化する書き方は以下の通りです.
typedef struct tagDataInfo {
    long offs;                //   
    char name[20];            //   
    std::list ord_list;  //       
    std::map<:string std::string=""> str_map; //       

    tagDataInfo() : offs(0) {
        memset(name, '0', sizeof(char) * 20);
        ord_list.clear();
        str_map.clear();
    };
} DataInfo;

具体的な原因についてはhttps://blog.csdn.net/changqing5818/article/details/78523299