У меня есть следующий класс:
class washm_t
{
public:
enum door_t { closed = 0, open = 1 };
private:
door_t door_state ;
public:
int open() ;
};
Проблема с классом в том, что open
name определяется как имя метода внутри класса и значение типа enum.
Вопрос: могу ли я как-то изменить код, чтобы оба open
имена работают внутри класса или я должен выбрать другое имя для open()
метод или для open
значение типа enum?
Вот как open()
функция выглядит так:
int washm_t::open()
{
if(door_state == open) // ~fails, 'open' interpreted as name of method
// not as name of enum type value
return 1 ;
else
return door_state = open, 0 ;
}
В C ++ 11 вы можете использовать enum class
:
enum class door_t { closed = 0, open = 1 };
Но тогда вы должны обратиться к door_t::open
вместо просто open
, Это имеет свои преимущества и недостатки многословия. enum class
хорошо в тех случаях, когда вероятен конфликт имен, и он эффективно добавляет общий префикс к перечислителям перечисления.
(На самом деле, в C ++ 11 вам не нужно использовать class
ключевое слово. Просто ссылаясь на door_t::open
разрешает конфликт без других изменений.)
Вы можете прийти к аналогичному решению в C ++ 03, поставив enum
внутри class
(следовательно, синтаксис функции C ++ 11)
struct door_state {
enum door_t { closed = 0, open = 1 };
};
Вы можете сделать это вложенным классом или определить его раньше washm_t
и использовать его в качестве базового класса
class washm_t : public door_state {
int open();
};
Сейчас тот член open()
переопределяет перечислитель, но перечислитель по-прежнему доступен как door_state::open
, а также closed
все еще доступен с использованием того же синтаксиса, что и раньше.
Как насчет использования заглавных букв или придания им разумного префикса?
enum door_t { CLOSED = 0, OPEN = 1 };
enum door_t { door_closed = 0, door_open = 1 };
Вы не можете иметь символы в одном и том же пространстве имен или области с тем же именем. Компилятор не может отличить одно от другого.
Проблема здесь с соглашением о кодировании. Я обычно предпочитаю использовать заглавные буквы для именованных констант, таких как enums
enum door_t { CLOSED = 0, OPEN = 1 };