Última atualização:2026-10-12
C++ enum class enumerações fortemente tipadas¶
No Effective Modern C++, Item 10: Prefer scoped enums to unscoped enum recomenda-se usar enum class com escopo no lugar do enum sem escopo.
Por exemplo:
O erro acima ocorre porque os dois circle estão no mesmo escopo. Para o enum, isso equivale a:
Portanto, definir circle de novo depois gera erro.Assim, não importa se os nomes dos enums são iguais: basta que haja membros coincidentes para haver problema. Por exemplo:
a aparece duas vezes; o erro é apontado no a do enum B.Pelo que vimos antes, o nome do enum não desempenha nenhum papel quanto ao escopo; por isso, lembramos do namespace, como no exemplo abaixo:
// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
enum Enum {
Ground = 0,
Human,
Aerial,
Total
};
}
void foo(EntityType::Enum entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
Mas usar namespaces sem parar torna-se por demais trabalhoso; além disso, se eu não quiser usar namespace, alcançar esse efeito torna-se inseguro e sem restrições.
Por isso, a partir do C++11, foi introduzido o enum class.
O enum class resolve problemas como definir o tipo dos membros do enum, a segurança de tipos e as restrições. Voltando ao exemplo acima:
// enum class
enum class EntityType {
Ground = 0,
Human,
Aerial,
Total
};
void foo(EntityType entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
Tópicos relacionados¶
- C++ evitar o construtor padrão | C++那些事
- Idiom de lista de inicialização de classes em C++ | C++那些事
- C++: templates de classe em vez de templates de função | C++那些事
- Idiom copy-and-swap em C++ | C++那些事
- Injeção de dependência em C++ | C++那些事
- C++ Header-Only versus separação de implementação | C++那些事
- Idiom de avaliação preguiçosa em C++ | C++那些事
- Idiom de consulta em tabela em C++ | C++那些事
- Ponteiros para membros e type info em C++ | C++那些事
- Idiom Mixin em C++ | C++那些事