MrSayMyName
@MrSayMyName

Как разнести класс по файлам?

Всем привет.

Я читал про то как правильно разносить классы по файлам. Интерфейсы (.h) отдельно, реализация (.cpp) отдельно. Но у меня возник вопрос. Я пишу класс (например для работы с векторами или матрицами) - большинство функций либо inline, либо содержат в себе максимум 2-3 строчки. Разносить подобный класс на несколько файлов...эм...

Насколько дурным тоном будет реализовать весь такой класс в одном файле (в .h например)? И как поступать в этой ситуации правильно?
  • Вопрос задан
  • 673 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Принцип прост. В .h можно ставить только то, что не производит кода. Как только в проекте появится второй CPP и задействует этот хедер, код будет произведён дважды, и компоновщик (cl/ld/ilink) будет ругаться, что переменная или функция в двух экземплярах. Что именно не производит кода…
• Определения макросов. Они в принципе кода не производят.
• Объявление любого типа. Оно лишь говорит об устройстве этого самого типа; код же производят те, кто этим типом пользуются.
• Шаблоны. Код производит не сам шаблон, а факт расшаблонивания. Разумеется, шаблон может расшаблониться в двух единицах компиляции, но с этим автоматически бороться научились.
• inline—  код производит не сам inline, а факт включения. inline бывает как явный ключевым словом, так и неявный — в теле класса.
• Прототипы и extern — они говорят: код есть, но где-то не здесь.
• Constexpr C++11. Они подставляют значение.
• Некоторые const в зависимости от компилятора. Например, на Borland const double производит код, а const int — нет.

Производят код и в хедерах запрещены.
• Переменная без extern, даже const.
• Функция, которая не inline.
• Полностью специализированный шаблон, в котором не осталось шаблонных параметров (template<>).

Не производят кода, но и лучше закинуть в CPP.
• Некоторые скрытые (private) inline и шаблоны, если они не используются из хедера.
Ответ написан
@abcd0x00
Насколько дурным тоном будет реализовать весь такой класс в одном файле (в .h например)?

Их специально сделали отдельными, потому что они не компилируются, а только вставляются напрямую через include. Некоторые расчитаны на единственную вставку (тогда делаются ворота из ifndef), а некоторые - на множественную вставку (тогда и ворота из ifndef не нужны). И вот когда они вставлены, тогда они и компилируются уже в контексте того места, куда они вставлены.
Назначение файлов .h - сделать видимыми имена (объявить имена).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы