Zamierzam założyć, że myState
ma typ twojego enum State
.
Tradycyjne użycie enum
polega na tworzeniu stałych wartości, które może przyjmować zmienna tego typu. Chcesz ustawić zmienną myState
dla wartości zdefiniowanych w enum
.
Parametr enum
definiuje 1, 2, 4 i 8 jako prawidłowe wartości, ale użytkownik chce mieć możliwość ustawienia zmiennej na 4 | 2 = 6. Podczas gdy C używa zdefiniowanego przez implementację typu int
dla wszystkich enum
, nie ma to miejsca w C++. myState = 6
nie jest poprawne w C++. W rzeczywistości myState = 4
nie jest poprawne w C++, musisz rzucić bezpośrednio lub użyć jednej ze stałych nazw enum
.
Mimo że jest to możliwe w C, nie jest dobrą praktyką, aby ustawić myState
na wartość, która nie jest zdefiniowana przez jego typ (na przykład do 6).
W twoim przypadku, to rozwiązanie, które wydaje konsekwencji byłoby:
typedef enum {
OTHER,
MINIMIZED,
MAXIMIZED
} win_size_t;
typedef struct {
win_size_t current;
win_size_t next;
} state_t;
state_t myState;
W ten sposób, można napisać do pól current
i next
undependently.
Jeśli nadal chcesz mieć pola bitowe, możesz ustawić rozmiar elementów swojej struktury w bitach. Jest to jednak trochę niebezpieczne, implementacja pól bitowych zależy od twojego kompilatora. Nie jestem nawet pewien, czy kompilatory zaakceptowałyby typ wyliczeniowy w polu bitowym (powinno być w porządku w C, ponieważ enum
s są).
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
Poprzednie rozwiązania są oczywiście ważne.Chodzi mi o to, że jeśli twoja zmienna myState
ma twój enum State
jako typ, powinna używać tylko członków enum
dla swoich wartości, a nie dla kombinacji.
Być może myState
ma inny typ, co wiem.
Jeśli myState
nie jest typu enum State
, wówczas można użyć stałych zdefiniowanych w enum
w połączeniu.
enum State {
MINIMIZING = (1u << 0),
MAXIMIZING = (1u << 1),
MINIMIZED = (1u << 2),
MAXIMIZED = (1u << 3),
};
unsigned int myState = 0;
myState |= MAXIMIZED; // sets that bit
myState &= ~MAXIMIZED; // resets that bit
To pozwala zrobić dwie rzeczy w jednym Zadanie:
myState = MAXIMIZED | MINIMIZING;
ale również rzeczy, które nie mogą chcieć:
myState = MAXIMIZED | MINIMIZED; // does that make sense?
dzięki! Poszedłem do opcji nr 1. Rzeczywiście nie ma sensu, który "MAKSYMALIZOWANO | MINIMIZOWANE "jest możliwe, a dla czytelności lepiej mieć dwie wyliczenia. –
Należy pamiętać, że ograniczanie wyliczeń do plików bitowych jest niezdefiniowanym zachowaniem, a wynik zależy od kompilatora. Proszę też poprawić mnie, jeśli się mylę. –
@ DavidTóth Wydajesz się być poprawny, dzięki za to! https://stackoverflow.com/a/33590935/108802 – Gauthier