2012-01-17 10 views
5

Jak zainicjować wartości następującej struktury w konstruktorze na zdefiniowane wartości?Jak zainicjować pole bitowe w konstruktorze

Oba pokazane na moim przykładzie kodu opcje wydają się być nieco brzydki ....

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

Uważaj z alternatywą 'memset', jeśli masz funkcje wirtualne w klasie, ponieważ spowoduje to również zastąpienie tabeli vtable. –

+0

Straszne konwencje nazewnictwa. Dziedzictwo, jak sądzę? W każdym razie, 'fReserve80_0 (0)' jest standardowym sposobem, a właściwie mniej brzydkim i łatwiejszym w utrzymaniu i bardziej bezpiecznym w użyciu niż memset. –

+0

@phresnel: Ooooh tak ... :-(Wcześniejszy kod, który przestał działać, gdy jest używany na nowej, szybszej maszynie –

Odpowiedz

3

Oczywistym rozwiązaniem byłoby umieścić wszystkie bity w oddzielnej struktury , który jest członkiem swojej strukturze i skopiuj zainicjować tę od członka statycznego, np:

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

To byłoby nawet pozwala niektórym bitom mieć wartość różną od 0.

2

myślę Option A nie jest tak źle. Jeśli zgadzasz się z problemem posiadania różnych nazwanych zmiennych dla każdego bitu, to bądź tak dobry, aby zainicjować je oddzielnie. Option B wydaje się być brudnym hackerem i może nawet być technicznie niezdefiniowanym zachowaniem (nie jestem jednak całkowicie pewien). W każdym razie lepiej być bezpiecznym niż żałować. Pomyśl o tym, istnieje duża szansa, że ​​to rzeczywiście UB, ponieważ twój typ nie jest POD.

Proszę zauważyć, że moja odpowiedź ma miejsce, jeśli chcesz mieć różne zmienne nazwane dla każdego bitu. Zawsze możesz mieć std::vector<bool> lub std::bitset<N> lub boost::dynamic_bitset jako członka zamiast wszystkich tych pól bitowych.

0

Wariant C

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

Można użyć bitset zamiast pól bitowych i nie trzeba robić nic specjalnego dla inicjalizacji, jeśli chcesz je wszystkie rozbrojony. Zamiast zajęć z 14 członkami możesz zapewnić funkcje członkowskie, które wykonają tę samą pracę.

+0

Przepraszam, muszę zachować strukturę danych, więc nie ma dla mnie bitsetu .... –