如何在构造函数中将以下结构的值初始化为定义的值?
我的代码示例中显示的两个选项似乎都有点难看......
struct T_AnlagenInfo01
{
// Option A
T_AnlagenInfo01() : fReserve80_0(0), fReserve80_1(0),.... {};
// Option B
T_AnlagenInfo01()
{
memset(this, 0, sizeof(T_AnlagenInfo01));
}
unsigned long fReserve80_0 : 1;
unsigned long fReserve80_1 : 1;
unsigned long fReserve80_2 : 1;
unsigned long fReserve80_3 : 1;
unsigned long fReserve80_4 : 1;
unsigned long fReserve80_5 : 1;
unsigned long fReserve80_6 : 1;
unsigned long fReserve80_7 : 1;
unsigned long fReserve81_0 : 1; // 81
unsigned long fReserve81_1 : 1;
unsigned long fReserve81_2 : 1;
unsigned long fReserve81_3 : 1;
unsigned long fReserve81_4 : 1;
unsigned long fReserve81_5 : 1;
unsigned long fReserve81_6 : 1;
unsigned long fReserve81_7 : 1;
};
答案 0 :(得分:3)
一个明显的解决方案是将所有位单独放在一起 结构,它是您的结构的成员,并复制初始化 来自静态成员,例如:
struct T_AnlagenInfo01
{
struct Bits
{
unsigned long fReserve80_0 : 1;
unsigned long fReserve80_1 : 1;
// ...
};
Bits myBits;
static Bits initialBits;
T_AnlagenInfo01 : myBits(initialBits) {}
};
T_AnlagenInfo01::Bits T_AnlagenInfo01::initialBits = {};
这甚至允许某些位具有不同于0的值。
答案 1 :(得分:2)
我认为Option A
并不是那么糟糕。如果您同意为每个位设置不同的命名变量的麻烦,那么也可以单独初始化它们。 Option B
似乎是一个肮脏的黑客,甚至可能在技术上是未定义的行为(虽然我不完全确定)。无论如何,比抱歉更安全。想想看,有一个很有可能它实际上是UB,因为你的类型不是POD
。
请注意,如果您想为每个位设置不同的命名变量,我的答案就成立了。您可以始终使用std::vector<bool>
或std::bitset<N>
或boost::dynamic_bitset
作为成员,而不是所有这些位字段。
答案 2 :(得分:0)
选项C
struct T_AnlagenInfo01
{
bitset<14> mybits;
}
您可以使用bitset而不是bit字段,如果您希望它们全部未设置,则无需对初始化执行任何特殊操作。而不是一个有14个成员的类,你可以提供成员函数来完成同样的工作。