「ゲームプログラマになる前に覚えておきたい技術」より。
新しくソースを作成してヘッダファイルをincludeするとき、includeする順番やincludeを忘れてエラーになることが面倒で、ついつい前のソースからincludeしている部分をコピペして済ましてしまうことが多い。
これだと必要の無いものまでincludeしてしまい、ヘッダファイルを変更したときに無駄なコンパイル作業が発生してしまう。小さなプロジェクトならすぐにビルドは終わるので問題ないだろうが、プロジェクトが巨大になるとコンパイル作業にかかる時間も無視できなくなってくる。私はちょっと変更しては実行して確認するタイプなので、すぐにビルドが終わることは重要。
ということで、なるべくincludeするヘッダファイルを減らすようにすべきである。
クラスAがクラスBをメンバ変数に持っているとクラスBの定義が書かれたincludeが必要になる。
// A.h #include "B.h" class A { B b; };
これをメンバ変数にクラスBの実体を持たずにポインタにすればクラスBを宣言するだけで済む。また、関数の引数や戻り値に使う場合でも大丈夫。
// A.h class B; class A { B* b; public: B getB(); void setB( B ); };
もちろん、クラスAのメンバ関数内でクラスBのメンバ関数を使っているならクラスAのソースではクラスBのヘッダをincludeしなくてはならない。でもクラスAだけ使うソースではクラスBのヘッダをincludeしなくて良い。
このようにincludeするヘッダファイルを減らすことは、それぞれの依存関係も減ることになり、コードの見通しも良くなるしデバッグもしやすくなる利点がある。
ついつい、自分は二つのクラスがそれぞれを参照しあうという依存しまくったコードを書いてしまうので、今回のincludeを減らすことを意識して、そういった分かりにくい実装をしないようにしていきたいと思う。