あなたの同僚は間違っています。一般的な方法は、コードを.cppファイル(または任意の拡張子)に入れ、宣言をヘッダーに入れることです。
ヘッダーにコードを配置することにはメリットがある場合がありますが、これにより、コンパイラーがより巧妙なインライン化を行うことができます。ただし、同時に、すべてのコードはコンパイラーに組み込まれるたびに処理する必要があるため、コンパイル時間が破壊される可能性があります。
最後に、すべてのコードがヘッダーである場合に、オブジェクトの循環関係(場合によっては望ましい)を持つことはしばしば煩わしいものです。
結論、あなたは正しかった、彼は間違っている。
編集:私はあなたの質問について考えてきました。彼の言うことが真実であるケースが1つあります。テンプレート。boostなどの新しい「モダン」ライブラリの多くはテンプレートを多用し、多くの場合「ヘッダーのみ」です。ただし、これはテンプレートを処理するときにのみ行う必要があります。テンプレートを処理するときにそれを行う唯一の方法だからです。
編集:一部の人々はもう少し明確化を望みます、ここに「ヘッダーのみ」のコードを書くことの欠点についてのいくつかの考えがあります:
周りを検索すると、boostを処理するときにコンパイル時間を短縮する方法を見つけようとする人がかなりたくさんいます。例:Boost Asioを使用してコンパイル時間を短縮する方法。これには、boostが含まれた単一の1Kファイルの14秒のコンパイルが表示されます。14は「爆発」しているように見えないかもしれませんが、それは確かに通常よりもはるかに長く、非常にすぐに加算されます。大規模なプロジェクトを扱う場合。ヘッダーのみのライブラリは、かなり測定可能な方法でコンパイル時間に影響します。ブーストはとても便利なので、私たちはそれを許容します。
さらに、ヘッダーだけでは実行できないことがたくさんあります(boostには、スレッドやファイルシステムなどの特定の部分にリンクする必要があるライブラリがあります)。主な例は、複数の定義エラーが発生するため、ヘッダーのみのライブラリに単純なグローバルオブジェクトを含めることができないことです(シングルトンであるabominationに頼らない限り)。注: C ++ 17のインライン変数により、この特定の例は将来的に実行可能になります。
最後のポイントとして、ヘッダーのみのコードの例としてブーストを使用すると、多くの場合、詳細が見落とされます。
Boostはライブラリであり、ユーザーレベルのコードではありません。それほど頻繁には変更されません。ユーザーコードでは、すべてをヘッダーに入れると、少しの変更でもプロジェクト全体を再コンパイルする必要があります。これは、時間の浪費であり、(コンパイルごとに変化しないライブラリの場合はそうではありません)。ヘッダー/ソースとより良いものに分割し、フォワード宣言を使用してインクルードを削減すると、1日で合計すると、再コンパイルの時間を節約できます。