Klasy wyliczeniowe („nowe wyliczenia”, „silne wyliczenia”) rozwiązują trzy problemy z tradycyjnymi wyliczeniami w języku C ++:
- konwencjonalne
enumsniejawnie 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.
enumNie 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 enumklasy 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 Coloursienum class Fruits. Bo kiedy pisałem kod w VS 2010. zgłasza błąd"expects a defination or a tag name"mocyclass.