如何初始化构造函数中的位字段

时间:2012-01-17 13:20:17

标签: c++

如何在构造函数中将以下结构的值初始化为定义的值?

我的代码示例中显示的两个选项似乎都有点难看......

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;
};

3 个答案:

答案 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个成员的类,你可以提供成员函数来完成同样的工作。