2012-01-17 13 views
5

¿Cómo se inicializan los valores de la siguiente estructura en un constructor con los valores definidos?Cómo inicializar un campo de bit en un constructor

Ambas opciones que se muestran en mi ejemplo de código parecen ser un poco feo ....

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

Tenga cuidado con la alternativa 'memset' si tiene funciones virtuales en la clase, ya que también sobrescribirá el vtable. –

+0

Horribles convenciones de nomenclatura. Legado, ¿supongo? De todos modos, 'fReserve80_0 (0)' es la forma estándar, y en realidad menos fea y más fácil de mantener y segura que memset. –

+0

@phresnel: Ooooh sí ... :-(Código heredado que dejó de funcionar cuando se usaba en una nueva máquina más rápida –

Respuesta

3

Una solución obvia sería poner todos los bits en un estructura separada, que es un miembro de su estructura, y copiar inicializar que de un miembro estático, por ejemplo:

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

Esto haría incluso permite que ciertos bits tengan un valor diferente de 0.

2

creo Option A no es tan malo. Si está de acuerdo con el problema de tener diferentes variables nombradas para cada bit, sea tan amable de inicializarlas por separado también. Option B parece un truco sucio e incluso puede ser técnicamente un comportamiento indefinido (aunque no estoy del todo seguro). En cualquier caso, es mejor prevenir que lamentar. Ahora que lo pienso, hay muchas posibilidades de que sea realmente UB porque tu tipo no es POD.

Tenga en cuenta que mi respuesta es válida si desea tener diferentes variables con nombre para cada bit. Siempre puede tener un std::vector<bool> o std::bitset<N> o boost::dynamic_bitset como miembro en lugar de todos estos campos de bits.

0

Opción C

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

Puede utilizar el bitset en lugar de campos de bits y usted no tiene que hacer nada especial para la inicialización si se desea todo desarmado. Y en lugar de una clase con 14 miembros, puede proporcionar funciones de miembro para hacer el mismo trabajo.

+0

Lo siento, tengo que mantener la estructura de datos. Por lo tanto, no hay bitset para mí .... –

Cuestiones relacionadas