Ваш коллега не прав, обычным способом было и всегда было помещать код в файлы .cpp (или любое другое расширение, которое вам нравится) и объявления в заголовках.
Иногда есть смысл помещать код в заголовок, это может позволить более умному встраиванию компилятором. Но в то же время это может разрушить время компиляции, поскольку весь код должен обрабатываться каждый раз, когда он включается компилятором.
Наконец, часто раздражает наличие циклических объектных отношений (иногда желательно), когда весь код является заголовками.
Итог, вы были правы, он не прав.
РЕДАКТИРОВАТЬ: Я думал о вашем вопросе. Существует один случай, когда то, что он говорит, является правдой. шаблоны. Многие новые «современные» библиотеки, такие как boost, интенсивно используют шаблоны и часто являются «только заголовками». Однако это следует делать только при работе с шаблонами, поскольку это единственный способ сделать это при работе с ними.
РЕДАКТИРОВАТЬ: Некоторые люди хотели бы немного больше разъяснений, вот некоторые мысли о минусах написания кода "только заголовок":
Если вы будете искать вокруг, вы увидите, что довольно много людей пытаются найти способ сократить время компиляции при работе с boost. Например: Как сократить время компиляции с Boost Asio , который видит компиляцию 14 с одного файла 1K с включенным Boost. Может показаться, что 14-ые не «взрываются», но они, безусловно, намного длиннее обычных и могут складываться довольно быстро. При работе с большим проектом. Библиотеки только с заголовками влияют на время компиляции весьма измеримым образом. Мы просто терпим это, потому что повышение очень полезно.
Кроме того, есть много вещей, которые нельзя сделать только в заголовках (даже в boost есть библиотеки, на которые нужно ссылаться для определенных частей, таких как потоки, файловая система и т. Д.). Основным примером является то, что вы не можете иметь простые глобальные объекты в заголовках только libs (если вы не прибегаете к мерзости, которая является одиночной), так как вы столкнетесь с множественными ошибками определения. ПРИМЕЧАНИЕ: Встроенные переменные C ++ 17 сделают этот конкретный пример выполнимым в будущем.
В заключение, при использовании boost в качестве примера кода, содержащего только заголовки, часто пропускаются огромные детали.
Boost - это библиотека, а не код пользовательского уровня. так что это не так часто меняется. В коде пользователя, если вы помещаете все в заголовки, каждое небольшое изменение заставит вас перекомпилировать весь проект. Это огромная трата времени (и это не относится к библиотекам, которые не переходят от компиляции к компиляции). Когда вы делите вещи между заголовком / источником и, еще лучше, с помощью предварительных объявлений, чтобы уменьшить количество включений, вы можете сэкономить часы перекомпиляции при суммировании за день.