Перечисления внутри классов

0

Допустим, у меня есть класс C, который имеет состояние атрибута, которое может принимать значения вниз, плоские или вверх. Вместо того, чтобы представлять переменную состояния в виде целого числа, мы можем вместо этого использовать перечисления (которые в основном являются целыми числами). Например,

class C{
public:
    enum state {down = -1, flat = 0, up = 1};
    C(state s = flat) : st(s) {}
private:
    state st;
};

Причина включения enum в общедоступную часть класса заключается в том, что другие объекты также могут использовать этот список перечислений. Они должны были бы позвонить

C::up

для извлечения значения вверх. Мой вопрос: является ли "лучшей практикой" либо размещение деклараций перечисления внутри класса, либо вне его (например, непосредственно над ним)? Если перечисление представляет значения/состояния, которые имеют смысл только для этого класса, тогда он чувствует себя интуитивно, чтобы поместить его в определение класса.

Спасибо.

Теги:

3 ответа

0
Лучший ответ

Если перечисление семантически имеет смысл только в контексте класса, то вполне естественно удерживать его внутри. Если он имеет глобальный смысл, он должен быть вне класса. В любом случае размещение перечисления должно отражать семантику разрабатываемой системы.

Таким образом, я полностью согласен с вашими последними предложениями.

1

Скорее всего, вам не нужны свободные плавающие перечисления - они должны либо находиться в классе, либо в пространстве имен. Если перечисление имеет смысл только в этом конкретном классе, то, вероятно, лучше всего разместить его внутри - я считаю, что SFML имеет пример этого со своими событиями (sf :: Event имеет член типа sf :: Event :: EventType, который может принимать такие значения, как sf :: Event :: KeyPressed и т.д.).

  • 0
    Я согласен, что, по крайней мере, размещение его в пространстве имен (что, по сути, является тем, что мы достигаем, помещая его в публичный раздел в определении класса) чувствует себя лучше. Как вы сказали, чтобы избежать свободно плавающих перечислений.
0

Если вы используете С++ 11, вы можете использовать строго типизированные перечисления. Они имеют вид:

enum class state
//     ^
{
    Down, Flat, Up
};

Теперь вы получите доступ к ним, используя:

state::Down
state::Flat
state::Up

Обратите внимание, что это требует от вас квалификации /using элемента, что всегда является хорошей практикой. Однако не то, что эти перечисления являются безопасными типами, поэтому их нельзя произвольно использовать как целые числа (вы, вероятно, не должны этого делать).

  • 0
    Ах, это на самом деле довольно мило.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню