Klasy wyliczeniowe („nowe wyliczenia”, „silne wyliczenia”) rozwiązują trzy problemy z tradycyjnymi wyliczeniami w języku C ++:
- konwencjonalne
enums
niejawnie konwertuj naint
, powodując błędy, gdy ktoś nie chce, aby wyliczenie działało jak liczba całkowita.
- standardowy
enums
eksportują swoje moduły wyliczające do otaczającego zakresu, powodując konflikty nazw.
enum
Nie można określić bazowego typu an , co powoduje zamieszanie, problemy ze zgodnością i uniemożliwia przekazanie deklaracji.
enum class
(„silne wyliczenia”) są silnie wpisane i mają określony zakres:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Jak pokazano, tradycyjne wyliczenia działają jak zwykle, ale można teraz opcjonalnie kwalifikować się przy użyciu nazwy wyliczenia.
Nowe wyliczenia są „klasami wyliczeń”, ponieważ łączą aspekty tradycyjnych wyliczeń (wartości nazw) z aspektami klas (elementy członkowskie o określonym zakresie i brak konwersji).
Możliwość określenia podstawowego typu pozwala na prostszą interoperacyjność i gwarantowane rozmiary wyliczeń:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
Umożliwia również przekazywanie do przodu wyliczeń:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Typ bazowy musi być jednym z typów całkowitych ze znakiem lub bez znaku; wartość domyślna to int
.
W bibliotece standardowej enum
klasy służą do:
- Systemy odwzorowania specyficzne kody błędów: W
<system_error>
: enum class errc
;
- Wskaźniki bezpieczeństwa wskazówki: W
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Błędy strumienia we / wy: w
<iosfwd>
:enum class io_errc { stream = 1 };
- Asynchroniczna obsługa błędów komunikacji: W
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Kilka z nich ma operatory, takie jak ==
zdefiniowano.
enum class Colours
ienum class Fruits
. Bo kiedy pisałem kod w VS 2010. zgłasza błąd"expects a defination or a tag name"
mocyclass
.