2012-01-17 4 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

vtableも上書きするので、クラスに仮想関数がある場合は、 'memset'代替に注意してください。 –

+0

ひどい命名規則。レガシー?とにかく、 'fReserve80_0(0)'は標準的な方法であり、memsetよりも実際にはあまり醜く、メンテナンス可能で型安全です。 –

+0

@phresnel:Oooohはい... :-(新しい高速なマシンで使用すると、動作しなくなったレガシーコード –

答えて

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は汚れたハックのように思えますし、技術的には未定義の行動かもしれません(私は完全にはわかりません)。いずれにしても、残念ながら安全です。あなたのタイプがPODではないので、それを考えてみましょう、実際にUBであるという大きな可能性があります。

ビットごとに異なる名前の変数を使用する場合は、私の答えが当てはまることに注意してください。これらのすべてのビットフィールドではなく、常にstd::vector<bool>またはstd::bitset<N>またはboost::dynamic_bitsetをメンバーとして持つことができます。

0

オプションC

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

あなたはビットフィールドの代わりにビットセットを使用することができますし、あなたはそれらをすべて解除したい場合は、初期化のための特別な何かをする必要はありません。そして、14人のメンバーを持つクラスの代わりに、同じ仕事をするメンバー関数を提供することができます。

1つの明白な解決策は、例えば、静的メンバからその を初期化し、あなたの構造体のメンバーである別の 構造にすべてのビットを置くためにも、そしてコピーします
+0

申し訳ありませんが、データ構造を維持する必要があります。 –

関連する問題