Допустим, у меня есть класс C, который имеет состояние атрибута, которое может принимать значения вниз, плоские или вверх. Вместо того, чтобы представлять переменную состояния в виде целого числа, мы можем вместо этого использовать перечисления (которые в основном являются целыми числами). Например,
class C{
public:
enum state {down = -1, flat = 0, up = 1};
C(state s = flat) : st(s) {}
private:
state st;
};
Причина включения enum в общедоступную часть класса заключается в том, что другие объекты также могут использовать этот список перечислений. Они должны были бы позвонить
C::up
для извлечения значения вверх. Мой вопрос: является ли "лучшей практикой" либо размещение деклараций перечисления внутри класса, либо вне его (например, непосредственно над ним)? Если перечисление представляет значения/состояния, которые имеют смысл только для этого класса, тогда он чувствует себя интуитивно, чтобы поместить его в определение класса.
Спасибо.
Если перечисление семантически имеет смысл только в контексте класса, то вполне естественно удерживать его внутри. Если он имеет глобальный смысл, он должен быть вне класса. В любом случае размещение перечисления должно отражать семантику разрабатываемой системы.
Таким образом, я полностью согласен с вашими последними предложениями.
Скорее всего, вам не нужны свободные плавающие перечисления - они должны либо находиться в классе, либо в пространстве имен. Если перечисление имеет смысл только в этом конкретном классе, то, вероятно, лучше всего разместить его внутри - я считаю, что SFML имеет пример этого со своими событиями (sf :: Event имеет член типа sf :: Event :: EventType, который может принимать такие значения, как sf :: Event :: KeyPressed и т.д.).
Если вы используете С++ 11, вы можете использовать строго типизированные перечисления. Они имеют вид:
enum class state
// ^
{
Down, Flat, Up
};
Теперь вы получите доступ к ним, используя:
state::Down
state::Flat
state::Up
Обратите внимание, что это требует от вас квалификации /using
элемента, что всегда является хорошей практикой. Однако не то, что эти перечисления являются безопасными типами, поэтому их нельзя произвольно использовать как целые числа (вы, вероятно, не должны этого делать).