2012-01-17 87 views
5

如何初始化構造函數中以下結構體的值爲定義的值?如何初始化構造函數中的位字段

在我的代碼示例中顯示這兩個選項似乎有點難看....

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

如果您在類中具有虛函數,那麼請小心'memset'選項,因爲它也會覆蓋該vtable。 – 2012-01-17 13:23:56

+0

可怕的命名約定。遺產,我猜?無論如何,'fReserve80_0(0)'是標準的方式,實際上比memset更難看,更易於維護和類型安全。 – 2012-01-17 13:31:18

+0

@phresnel:Ooooh yes ... :-(傳統代碼在新機器上使用時停止工作 – 2012-01-17 13:33:22

回答

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.

2

我覺得Option A並不壞。如果您同意每個位具有不同的命名變量的麻煩,那麼也可以分別初始化它們。 Option B看起來像一個骯髒的黑客,甚至可能在技術上未定義的行爲(雖然我不完全確定)。無論如何,比對不起更安全。想想看,它有一個很可能是UB,因爲你的類型不是POD

請注意,如果您想爲每個位使用不同的命名變量,我的答案成立。您始終可以使用std::vector<bool>std::bitset<N>boost::dynamic_bitset作爲成員,而不是所有這些位字段。

0

選項C

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

您可以使用此位集,而不是位字段,你沒有,如果你想他們都沒有設置做任何特殊的初始化。而不是一個有14名成員的班級,你可以提供成員職能來完成同樣的工作。

+0

對不起,我必須保留數據結構。 – 2012-01-17 13:29:54