Le classi enum ("new enums", "strong enums") risolvono tre problemi con le enumerazioni C ++ tradizionali:
- convenzionale
enums
converte implicitamente in int
, causando errori quando qualcuno non vuole che un'enumerazione agisca come un numero intero.
- convenzionale
enums
esportare i propri enumeratori nello scope circostante, provocando conflitti di nome.
- Il tipo sottostante di un
enum
non può essere specificato, causando confusione, problemi di compatibilità e rendendo impossibile la dichiarazione anticipata.
enum class
("enumerazioni forti") sono fortemente tipizzati e con ambito:
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;
Come mostrato, le enumerazioni tradizionali funzionano come al solito, ma ora puoi facoltativamente qualificarti con il nome dell'enumerazione.
Le nuove enumerazioni sono "classe enum" perché combinano aspetti delle enumerazioni tradizionali (valori dei nomi) con aspetti delle classi (membri con ambito e assenza di conversioni).
Essere in grado di specificare il tipo sottostante consente un'interoperabilità più semplice e dimensioni garantite delle enumerazioni:
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 };
Consente inoltre la dichiarazione anticipata di enumerazioni:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Il tipo sottostante deve essere uno dei tipi interi con segno o senza segno; l'impostazione predefinita è int
.
Nella libreria standard, le enum
classi vengono utilizzate per:
- Codici specifici sistemi di mappatura di errore: In
<system_error>
: enum class errc
;
- Indicatori di sicurezza del puntatore: In
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Errori di flusso di I / O: In
<iosfwd>
:enum class io_errc { stream = 1 };
- Gestione degli errori di comunicazione asincrona: In
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Molti di questi hanno operatori, come ==
definito.
enum class Colours
eenum class Fruits
. Perché quando ho scritto il codice in VS 2010. Genera un errore"expects a defination or a tag name"
sottoclass
.