Última actualización:2026-10-12
C++ enum class enumeraciones fuertemente tipadas¶
En Effective Modern C++, Item 10: Prefer scoped enums to unscoped enum recomienda usar enum class con ámbito en lugar de enum sin ámbito.
Por ejemplo:
El error anterior se debe a que los dos circle están en el mismo ámbito. Para enum equivale a:
Por eso, definir circle más adelante da un error.Así que, aunque los nombres de las enumeraciones sean distintos, basta con que uno de sus miembros coincida para que haya problemas. Por ejemplo:
a aparece dos veces, y el error se produce en el a de enum B.Por lo que vimos antes, el nombre del enum no aporta nada en cuanto al ámbito, así que se nos ocurre usar namespace, como en el ejemplo siguiente:
// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
enum Enum {
Ground = 0,
Human,
Aerial,
Total
};
}
void foo(EntityType::Enum entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
Pero usar espacios de nombres continuamente resulta demasiado engorroso y, si no quiero usar namespace y aún así quiero conseguir ese efecto, la cosa se vuelve insegura y sin restricciones.
Por eso, a partir de C++11 se introdujo enum class.
enum class resuelve problemas como la definición del tipo de los miembros del enum, la seguridad de tipos y las restricciones. Volviendo al ejemplo anterior:
// enum class
enum class EntityType {
Ground = 0,
Human,
Aerial,
Total
};
void foo(EntityType entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
Temas relacionados¶
- C++ Evitar el constructor por defecto | C++那些事
- C++ Idioma de la lista de inicialización de clases | C++那些事
- C++: plantillas de clase antes que plantillas de función | C++那些事
- C++ Idioma copy-and-swap | C++那些事
- C++ Inyección de dependencias | C++那些事
- C++ Header-Only frente a separación de implementación | C++那些事
- C++ Idioma de evaluación perezosa | C++那些事
- C++ Idioma de la tabla de consulta | C++那些事
- C++ Punteros a miembros e información de tipos | C++那些事
- C++ Idioma mixin | C++那些事