Перечисления в C++ - какой лучше?


У меня есть большие пространства имен, но я не хочу перечислимые константы, чтобы быть частью этого. В случаях, когда перечисление связана с классом, я написал перечисления внутри класса так что я могу достичь его с помощью имени класса. Однако, если перечисление связано с функции пространства имен, что это лучший способ, чтобы сделать это?

  1. Использовать другое пространство имен и поместить перечисление внутри, так снаружи он будет таким же, как другие с разных реализациях?

  2. Продолжить и создать класс с частными застройщиками, так что будет так же, как другие?

Классы:

class A {
public:
   enum Type {
      Aa,
      Ab
   };

   Type GetType();
};

class B {
public:
   enum Type {
      Ba,
      Bb
   };

private:
   B();
};

B::Type DoSomething();

Пространство имен:

namespace B {
   enum Type {
       Ba,
      Bb
   };
}

B::Type DoSomething();

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



2716
6
задан 24 июля 2011 в 10:07 Источник Поделиться
Комментарии
4 ответа

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

Проблема с "enum в классе обертке" зависимость заголовка. Когда декларация код хочет использовать некоторые "перечисление в класс-оболочку" типа, то следует также ссылается на всю информацию о классе. Потому что нельзя физически отделить перечисления из класса-оболочки (правило одного определения), оно вводит более тяжелую зависимость заголовка.

Кроме того, поскольку в C++, там не может быть два отдельных определения для одного класса, так что вы не можете использовать прямой метод декларации с "enum в класс-оболочку", как показано ниже.

// a.h
namespace A {
enum Type {
a,
b
};
}

// b.h
namespace A {
enum Type; // forward declaration
}
A::Type function();

9
ответ дан 29 июля 2011 в 08:07 Источник Поделиться

Класс-это пространство имен + другие вещи. Вы не собираетесь использовать другие вещи, чтобы использовать пространство имен.

3
ответ дан 26 июля 2011 в 10:07 Источник Поделиться

Мне нравится класс. Не потому, что ее лучше ни чего, но в основном потому, что класс-это хороший агрегат для небольших объемов информации, что легко работать. пространства меньше. Какой инструмент позволяет работать с классами лучше управлять вещами.

Но на практике, он не собирается делать большой разницы в большинстве случаев.

2
ответ дан 25 июля 2011 в 05:07 Источник Поделиться

Я считаю, что нужно создать пространство имен е.MyConst г '' и поместите в нее все ваши перечисления. Перечисления в одном месте и легко изменить в будущем.

0
ответ дан 29 июля 2011 в 07:07 Источник Поделиться