Подтвердить что ты не робот

Где поместить перечисление в программу cpp?

У меня есть программа, которая использует типы перечислений.

enum Type{a,b,};


class A
{
 //use Type
};
class B
{
  // also use that Type
};
Класс

2 находится в двух разных файлах. Должен ли я помещать определение типа в headfile или в определении класса для каждого класса?

4b9b3361

Ответ 1

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

Ответ 2

Вы всегда должны пытаться ограничить объем типов на С++, поэтому перечисление должно быть, вероятно, объявлено в классе. Перечисление обычно будет принадлежать немного более естественно в одном классе, чем другое, - скажем, класс A, поэтому вы помещаете его в объявление A в заголовок a.h:

// a.h

class A {
    public:
       enum Type { a, b };
    ...
};

Теперь вам нужно включить a.h в заголовок, который объявляет B:

// b.h
#include "a.h"

class B {
   public:
      void f( A::Type t );     // use the Type enum
   ...
};

Ответ 3

Я вижу точку зрения Нила: для многих программистов это зрелище, чтобы увидеть материал в глобальном масштабе. otoh, imho, вводя класс только для перечисления, не является хорошим стилем: он должен быть перечисляемым не классом. Однако размещение одного и того же списка перечислений в обоих классах (это то, что вы просили) было бы наихудшей идеей: мы не хотим повторять материал.

Кроме того, в большинстве нетривиальных кодов можно использовать большее количество таких общих объектов (больше перечислений, константных параметров и т.д.) для реализации. Итак, я начал бы сбрасывать все это в пространство имен реализации (скажем, "подробно" ), которое является дочерним пространством имен ваших классов и находится в отдельном файле заголовка (скажем, "detail.hpp" ), включенном всеми. Например:

// file A.hpp 
#include "foo/detail.hpp"
namespace foo {
   class A 
   { 
   // accessing enum as detail::a 
   };
}

// file B.hpp
#include "foo/detail.hpp"
namespace foo { class B { ... }; }  

// file foo/detail.hpp
namespace foo { namespace detail {
   enum { a,b, ... }
   const int three = 3;
   // etc...
   // other implementation classes etc...
}}

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

Ответ 4

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

Ответ 5

Обычно я использую enum в своей программе на С++ так же, как "Neil Butterworth" сказал... Я нашел этот способ действительно чистым, понятным и понятным

Ответ 6

Это действительно зависит от того, являются ли значения одним и тем же логическим типом или просто имеют одинаковые имена. Было бы целесообразно назначить переменную A:: Type для C:: Type? Если они являются одним и тем же логическим типом, поместите их в заголовок, который включает оба. Чтобы сократить время сборки, вы, вероятно, захотите поместить его в свой собственный заголовочный файл, но если вы хотите сохранить количество файлов, поместите его в общий заголовок с другим материалом.

Другой вариант - поместить перечисление в общий базовый класс, который наследуется (это может не иметь смысла в этом случае, но это еще один вариант).