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

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

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

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

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

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

enum door_t { CLOSED = 0, OPEN = 1 };
Другие вопросы по тегам