C ++, класс с методом и типом enum — могут ли метод и значение enum иметь одинаковые имена?

У меня есть следующий класс:

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 ;
}

3

Решение

В 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 все еще доступен с использованием того же синтаксиса, что и раньше.

6

Другие решения

Как насчет использования заглавных букв или придания им разумного префикса?

enum door_t { CLOSED = 0, OPEN = 1 };

enum door_t { door_closed = 0, door_open = 1 };
2

Вы не можете иметь символы в одном и том же пространстве имен или области с тем же именем. Компилятор не может отличить одно от другого.

Проблема здесь с соглашением о кодировании. Я обычно предпочитаю использовать заглавные буквы для именованных констант, таких как enums

enum door_t { CLOSED = 0, OPEN = 1 };
0
По вопросам рекламы [email protected]