C++ には、匿名のビットフィールド構造体を含むクラスがあります。すべてのフィールドを手動で書き出すことなく、ゼロに初期化したいと考えています。
初期化を 3 つの場所に配置することを想像できます。
- ビットフィールドにコンストラクターを作成する
- 含まれているクラスのコンストラクターの初期化子リストをゼロにします
- 含まれているクラスのコンストラクターの本体でゼロを設定します
このビットフィールドには多くのフィールドがありますが、すべてをリストするのは避けたいと思います。
たとえば、次のコードを参照してください。
class Big {
public:
Big();
// Bitfield struct
struct bflag_struct {
unsigned int field1 : 1;
unsigned int field2 : 2;
unsigned int field3 : 1;
// ...
unsigned int field20 : 1;
// bflag_struct(); <--- Here?
} bflag;
unsigned int integer_member;
Big *pointer_member;
}
Big::Big()
: bflag(), // <--- Can I zero bflag here?
integer_member(0),
pointer_member(NULL)
{
// Or here?
}
これらのいずれかが望ましいですか?それとも、私が見逃しているものがありますか?
編集:以下の受け入れられた回答(Ferruccioによる)に基づいて、私はこの解決策に落ち着きました:
class Big {
// ...
struct bflag_struct {
unsigned int field 1 : 1;
// ...
bflag_struct() { memset(this, 0, sizeof *this); };
}
// ...
}