理由①コンパイル時間の短縮
私のプロジェクトにはありません: ソース ファイル (CPP) には、必要なヘッダー (HPP) のみが含まれています。したがって、わずかな変更のために 1 つの CPP のみを再コンパイルする必要がある場合、再コンパイルされていない同じ数のファイルが 10 倍になります。
おそらく、プロジェクトをより論理的なソース/ヘッダーに分割する必要があります。クラス A の実装を変更しても、クラス B、C、D、E などの実装を再コンパイルする必要はありません。
理由[2] 循環依存を避ける
コード内の循環依存関係?
申し訳ありませんが、この種の問題が実際の問題になることはまだありません: A が B に依存し、B が A に依存しているとしましょう:
struct A
{
B * b ;
void doSomethingWithB() ;
} ;
struct B
{
A * a ;
void doSomethingWithA() ;
} ;
void A::doSomethingWithB() { /* etc. */ }
void B::doSomethingWithA() { /* etc. */ }
この問題を解決する良い方法は、このソースをクラスごとに少なくとも 1 つのソース/ヘッダーに分割することです (Java の方法に似ていますが、クラスごとに 1 つのソースと 1 つのヘッダーを使用します)。
// A.hpp
struct B ;
struct A
{
B * b ;
void doSomethingWithB() ;
} ;
.
// B.hpp
struct A ;
struct B
{
A * a ;
void doSomethingWithA() ;
} ;
.
// A.cpp
#include "A.hpp"
#include "B.hpp"
void A::doSomethingWithB() { /* etc. */ }
.
// B.cpp
#include "B.hpp"
#include "A.hpp"
void B::doSomethingWithA() { /* etc. */ }
したがって、依存関係の問題はなく、コンパイル時間も短縮されます。
私は何か見落としてますか?
「現実世界」のプロジェクトに取り組むとき
実際のプロジェクトでは、誰が誰に依存しているかがわからなくなるまで、cpp ファイルにランダムなヘッダーが含まれる傾向があります。
もちろん。ただし、これらのファイルを再編成して「1 つの CPP」ソリューションを構築する時間がある場合は、それらのヘッダーをクリーンアップする時間があります。ヘッダーの私のルールは次のとおりです。
- ヘッダーを分解して、可能な限りモジュール化します
- 必要のないヘッダーを含めないでください
- シンボルが必要な場合は、前方宣言します
- 上記が失敗した場合のみ、ヘッダーを含めます
とにかく、すべてのヘッダーは自己完結型でなければなりません。つまり、次のことを意味します。
- ヘッダーには、必要なすべてのヘッダーが含まれます (必要なヘッダーのみ - 上記を参照)。
- 1 つのヘッダーを含む空の CPP ファイルは、他に何も含める必要なくコンパイルする必要があります。
これにより、順序付けの問題と循環依存関係が解消されます。
コンパイル時間は問題ですか? それで...
コンパイル時間が本当に問題になる場合は、次のいずれかを検討します。
結論
あなたがやっていることは、すべてをヘッダーに入れることではありません。
基本的に、すべてのファイルを 1 つの最終的なソースに含めます。
おそらく、あなたは完全なプロジェクトのコンパイルという点で勝っています。
しかし、1 つの小さな変更のためにコンパイルすると、常に負けてしまいます。
コーディングするときは、小さな変更を頻繁にコンパイルして (コンパイラーにコードを検証させるためだけに)、最後に 1 回、プロジェクト全体の変更を行うことを知っています。
私のプロジェクトがあなたのやり方で組織されていたら、私は多くの時間を失うでしょう.