c++複雑な構造体の初期化
最近、コード定義構造体を書く際に初期化の問題が発生し、c++11に対して以下の方法で初期化できることが分かった.
1.構造体を定義するときに直接値を付ける
構造体配列の定義時に直接値を割り当てて初期化
2.コンストラクション関数の初期化
c++構造体には、構造関数、メンバー関数などがあり、上記の構造関数ではmemsetで初期化することもできます.
しかし、この方法は変数、配列、vectorコンテナなどのネストされた複雑な構造体に対して、以下のようにエラーが発生しやすい.
正しく初期化する書き方は以下の通りです.
具体的な原因についてはhttps://blog.csdn.net/changqing5818/article/details/78523299
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