Где поместить перечисление в программу cpp?
У меня есть программа, которая использует типы перечислений.
enum Type{a,b,};
class A
{
//use Type
};
class B
{
// also use that Type
};
Класс
2 находится в двух разных файлах.
Должен ли я помещать определение типа в headfile или
в определении класса для каждого класса?
Ответы
Ответ 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? Если они являются одним и тем же логическим типом, поместите их в заголовок, который включает оба. Чтобы сократить время сборки, вы, вероятно, захотите поместить его в свой собственный заголовочный файл, но если вы хотите сохранить количество файлов, поместите его в общий заголовок с другим материалом.
Другой вариант - поместить перечисление в общий базовый класс, который наследуется (это может не иметь смысла в этом случае, но это еще один вариант).