2012-06-03 17 views
12

enumeraciones en C++ tienen un gran problema: No se puede tener un nombre en dos enumeraciones diferentes como este:Cómo evitar conflictos de nombres para dos valores enum con el mismo nombre en C++?

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

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

Entonces, ¿cuál es la mejor manera de manejar este problema en este ejemplo?

+1

Si la enumeración es específica de una clase, colóquela dentro de una (sección pública) de la clase, luego refiérase a los elementos por ej. ClassName :: None y OtherClassName :: None. También puede poner las enumeraciones en espacios de nombres. La forma típica de espacio de nombres en C puro es mediante prefijos a cada identificador enumerado. – pmdj

+0

Mi pregunta http://stackoverflow.com/questions/12972317/count-on-enum-c-automatic responde a su pregunta. – sergiol

+0

Las clases enum en C++ 11 parecen ser un buen intento. Pero tienes que lanzarlo después de aplicar '|'. – bytecode77

Respuesta

27

En C++ 03 se puede encerrar dentro de un enumstruct:

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

En C++ 11 lo convierten en un enum class:

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

En C++ 03 namespace als o puede ser envuelto, pero personalmente encuentro que envolver struct/class mejor porque namespace es más amplio. p.ej.

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

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

¿Por qué 'struct' y no' namespace'? – Pubby

+1

@Pubby, 'namespace' también está bien, pero encuentro' struct'/'class'" filosóficamente "más compatible con' enum class'. – iammilind

+4

@Pubby: Puedes especializar plantillas en 'struct'. –

3

Cualquiera de envolverlos en espacios de nombres o en las clases:

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

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

Una opción es poner cada enumeración en un espacio de nombres diferentes:

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

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

Una mejor opción, si está disponible con su compilador, es el uso de C++ 11 enum classes:

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

Vea here para una discusión sobre las clases enum.

1

¿Qué le parece usar la enumeración de alcance versus no abarcado? C++ 11 ahora ofrece una enumeración con ámbito. Un ejemplo sería:

enum class Browser : <type> { 

}; 

enum class OS : <type> { 

}; 

Acceda a los tipos enumerados a través de un objeto del navegador o un objeto del sistema operativo.

2

Puede usar enum class (scoped enums) que es compatible con C++ 11 en adelante. Está fuertemente tipado e indica que cada tipo de enum es diferente.

Browser::None != OS::None 

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

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