2012-06-03 12 views
12

enumerazioni in C++ hanno un grosso problema: non è possibile avere un nome in due enumerazioni differenti come questo:Come evitare conflitti di nomi per due valori di enumerazione con lo stesso nome in C++?

enum Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 

Allora, qual è il modo migliore per gestire questo problema in questo esempio?

+1

Se l'enum è specifico di una classe, inserirlo in una (sezione pubblica della classe), quindi fare riferimento agli elementi ad es. ClassName :: None e OtherClassName :: None. Puoi anche inserire le enumerazioni in spazi dei nomi. Il modo tipico di namespace in C pura è tramite prefissi per ciascun identificatore enumerato. – pmdj

+0

La mia domanda http://stackoverflow.com/questions/12972317/count-on-enum-c-automatic risponde alla tua domanda. Le classi di enumerazione – sergiol

+0

in C++ 11 sembrano essere un buon tentativo. Ma devi lanciarlo dopo aver applicato '|'. – bytecode77

risposta

27

In C++ 03 è possibile racchiudere all'interno di un enumstruct:

struct Browser 
{ 
    enum eBrowser 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    }; 
}; 

In C++ 11 ne fanno una enum class:

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
}; 

In C++ 03 namespace als o può essere spostato, ma personalmente trovo che lo spostamento di struct/class sia migliore perché namespace è più ampio. per esempio.

// file1.h 
namespace X 
{ 
    enum E { OK }; 
} 

// file2.h 
namespace X 
{ 
    enum D { OK }; 
} 
+0

Perché 'struct' e non' namespace'? – Pubby

+1

@Pubby, 'namespace' è anche ok, ma trovo' struct'/'class'" filosoficamente "più compatibile con' enum class'. – iammilind

+4

@Pubby: è possibile specializzare i modelli su 'struct'. –

3

O avvolgerli in spazi dei nomi o in classi:

namespace Browser { 
    enum BrowserType 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    } 
} 

namespace OS { 
    enum OSType { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 
12

Una possibilità è quella di mettere ogni enum in un diverso spazio dei nomi:

namespace Foo { 
    enum Browser { 
     None = 0, 
     Chrome = 1, 
     Firefox = 2 
    } 
} 

namespace Bar { 
    enum OS { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 

Una soluzione migliore, se disponibile con il compilatore, è quello di utilizzare C++ 11 enum classes:

enum class Browser { ... } 
enum class OS { ... } 

Vedere here per una discussione sulle classi enum.

1

E se si utilizza l'enumerazione con scope o senza ambito? C++ 11 ora offre l'enumerazione dell'ambito. Un esempio potrebbe essere:

enum class Browser : <type> { 

}; 

enum class OS : <type> { 

}; 

Accedere ai tipi enumerati tramite un oggetto del browser o un oggetto del sistema operativo.

2

È possibile utilizzare enum class (scoped enums) supportato in C++ 11. È fortemente digitato e indica che ogni tipo di enum è diverso.

Browser::None != OS::None 

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum class OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 
Problemi correlati