2012-05-02 13 views
13

Esiste un modo per riutilizzare lo stesso valore enum in tipi separati? Mi piacerebbe essere in grado di qualcosa di simile al seguente:Riutilizzo dei valori enum in tipi di enum separati

enum DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
enum DeviceType { UNKNOWN, PLAYBACK, RECORDING }; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DeviceState deviceState = DeviceState::UNKNOWN; 
    DeviceType deviceType = DeviceType::UNKNOWN; 
    return 0; 
} 

Questo ha senso per me, ma non per il C++ compiler- si lamenta: error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator' sulla linea 2 di cui sopra. C'è un modo corretto per farlo, o dovrei sempre usare valori enum univoci? Non riesco a immaginare che sia sempre possibile garantire se includo il codice di qualcun altro.

risposta

15

Si può, e dovrebbe, inserisci la tua enum in un namespace:

namespace DeviceState 
{ 
    enum DeviceState{ UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
} 
namespace DeviceType 
{ 
    enum DeviceType{ UNKNOWN, PLAYBACK, RECORDING }; 
} 

//... 

DeviceType::DeviceType x = DeviceType::UNKNOWN; 
+0

Grazie Luchian. Per favore potresti correggere il mio esempio per me. Non sono sicuro di come dichiarare una variabile usando gli spazi dei nomi come descritto sopra. –

+0

@IAmAI quindi il codice che ho postato non funziona? –

+0

Se dichiaro una variabile come 'DeviceState deviceState = DeviceState :: UNKNOWN;', viene visualizzato un errore del compilatore: ''DeviceState': uso illegale dell'identificatore dello spazio dei nomi nell'espressione' –

20

Per coloro che utilizzano C++ 11, si può scegliere di utilizzare:

enum class Foo 

invece di:

enum Foo 

Fornisce sintassi e vantaggi simili come spazi dei nomi. Nel tuo caso, la sintassi sarebbe:

enum class DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
DeviceState deviceState = DeviceState::UNKNOWN; 

Si noti che questo è fortemente tipizzato così hai bisogno di gettarli manualmente per interi (o qualsiasi altra cosa).