С С ++ 11
Этот ответ был первоначально написан в 2011 году. Теперь, когда поддержка C ++ 11 широко доступна, предпочтительным способом является использование enum class
, как указывает Мэтью Д. Сколфилд ниже:
enum class Player {
User,
Computer
};
Перечисленные константы должны указывать имя перечисления при ссылке (например, Player::Computer
).
До C ++ 11
Нет, в общедоступном enum нет ничего плохого. Имейте в виду, однако, что перечисляемые константы не могут быть квалифицированы по имени типа enum. То есть вы не можете написать Player::USER
или что-то подобное для ссылки на константу USER
; они появляются прямо во вложенном пространстве имен. Таким образом, было бы неплохо установить префикс для ваших констант, чтобы не возникало конфликтов имен.
Например, рассмотрим следующую декларацию:
enum Player {
PL_USER,
PL_COMPUTER
}
Это безопаснее, потому что коллизии имен гораздо реже с префиксом "PL_". Кроме того, он улучшает читабельность кода, подсказывая, какому перечислению принадлежит данная константа.
В таких языках, как C # и Java, применяется несколько иной подход к перечислениям, в котором необходимо указывать как имя перечисления, так и имя константы, например Player.USER
. Подобный эффект может быть достигнут в C ++, встраивая объявление enum в собственное пространство имен. Например:
namespace Player {
enum Type {
USER,
COMPUTER
}
}
Это дает эффект встраивания PLAYER
и COMPUTER
в пространство имен Player
вместо глобального (или иного включения) пространства имен. Является ли это хорошим подходом или нет, по моему мнению, является вопросом предпочтения.