Является ли хорошей практикой всегда создавать .cpp для каждого .h в проекте C ++? - PullRequest
7 голосов
/ 29 октября 2009

Некоторым классам, таким как исключения или шаблоны, нужен только файл заголовка (.h), часто с ним не связано .cpp.

Я видел, что в некоторых проектах (для некоторых классов) нет файлов .cpp, связанных с файлами заголовков, возможно, из-за того, что реализация настолько коротка, что выполняется непосредственно в .h, или, возможно, по другим причинам. , например, шаблоны классов, где обязательно включать реализацию в заголовок.

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

Ответы [ 9 ]

14 голосов
/ 29 октября 2009

Я бы не стал добавлять ненужные .cpp файлы. Каждый добавляемый вами файл .cpp должен быть скомпилирован, что просто замедляет процесс сборки.

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

8 голосов
/ 29 октября 2009

Неа. Если в .cpp нет ничего нужного, он вам не нужен.

4 голосов
/ 26 января 2017

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

При предпочтительном порядке, если dir2 / foo2.h пропускает все необходимые включения, сборка dir / foo.cpp будет прервана. Таким образом, это правило гарантирует, что разрывы сборки будут отображаться первыми для людей, работающих с этими файлами, а не для невинных людей в других пакетах.

3 голосов
/ 29 октября 2009

Это действительно лошади для курсов:

  • Только заголовочные классы: например, шаблон классы
  • Заголовок и cpp: разделяет объявление от реализации.
  • только cpp: ваш main () может жить в одном из них.

Исходный код, содержащий только заголовочный файл, иногда является единственным способом написания повторно используемых шаблонов. См. boost для множества примеров этого.

Заголовок и cpp более «нормальный». Он отделяет объявление от реализации и может ускорить компиляцию, когда компилятору не нужно много раз читать реализации. Вы можете начать здесь, а затем посмотреть, как идет реализация, и если файл cpp станет пустым, вы можете удалить его.
Другое дело, что у вас будет #include "foo.h" вверху foo.cpp, чтобы доказать, что кто-то еще может это сделать и не иметь ошибок компилятора.

Cpp только файлы. main () может жить здесь, и я поместил тестовые классы cppUnit в такие файлы.

1 голос
/ 29 октября 2009

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

Если у вас есть компилируемый код, включенный в несколько мест (из вашего комментария: «Можно ли избежать создания файла .cpp и записи кода непосредственно в заголовочный файл?»), Он будет компилироваться каждый раз (хотя вы предварительно скомпилированные заголовки) и компоновщик будет разрешать (или нет) раздутый объектный код.

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

1 голос
/ 29 октября 2009

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

Для дальнейшего обсуждения этой проблемы вы можете проверить мой старый вопрос: C ++ код в заголовочных файлах . Я не думаю, что ваш вопрос является точной копией, но он достаточно близок, чтобы вы могли его прочитать.

1 голос
/ 29 октября 2009

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

Однако большинство классов перерастают как шанс войти только в заголовок, так и шанс войти в types.h.

Несколько примеров из того, что я делаю. Я считаю, что класс для реализации трехмерного вектора Vector3 заслуживает его .h и .cpp, несмотря на свою простоту. Но Position на самом деле не заслуживает этого; в конце концов, это даже был бы P.O.D. структура, если бы не то противное getDistance(), которое мне нравится реализовано там.

Так что нет - не все классы заслуживают своих файлов .cpp и .h. Но большинство так и поступает, а те, кто не определенно, не стоят в одиночестве. Если они настолько короткие, что могут поместиться только в заголовке, они либо обнимаются вместе с другими короткими классами, либо идут в заголовок класса, с которым они тесно связаны.

1 голос
/ 29 октября 2009

Есть очень полезные и успешные библиотеки, как и многие в boost , которые предназначены только для заголовков.

1 голос
/ 29 октября 2009

Эмпирическое правило, держите связанный класс вместе в одном файле. Большинству разных классов нужно помещать в свои файлы .hpp и .cpp. Причина этого в том, что в больших проектах у вас есть до 10 000 классов, и если поместить это количество файлов пользователю и IDE, как правило, что-то сломается.

...