2010-12-11 8 views
2

お互いを使用するプログラム内で複数のクラスを作成する場合、私は混乱を減らすために必要な最小限のヘッダーファイルのみをインクルードしたいと思うことがよくあります。別のヘッダに含まれるファイルを含めるべきですか?

たとえば、クラスCはクラスAを含むクラスBから継承します。クラスBはクラスAをメンバーとして含んでいるので、をb.hに含める必要があります。しかし、Cにもa.hを含める必要があるとします。私はと怠惰なので、私はちょうど(Cとにかく含める必要があります)b.hが含まれ、b.h以来、すでにa.hを含んで、私はより多くのものを含める必要はありませんし、それが正常にコンパイルされます。私の.cppファイルと同じです:ヘッダーだけを含めれば、ヘッダーに含まれるものは自動的に.cppファイルに含まれますので、そこには含めません。

これは私の悪い習慣ですか?それは私のコードを読みにくくしますか?

答えて

4

は、外部に頼らずに解析されるヘッダファイルのために必要な何含める(言い換えれば:あなたのヘッダは自給自足します)注文含まれています。

c.hがから継承するclass Cを宣言している場合は、明らかにB.hを含める必要があります。ただし、がc.hに表示されない場合は、それを含める理由はないと私は信じています。 b.hにはAと記載されているという意味で、b.hは、前方に宣言するAまたはa.hのいずれかを解析する必要があります。

私の視点から、あなたは何をすべきかをしています。

c.hAと言い始める場合は、適切なインクルードまたはフォワード宣言を追加するので、私はb.hということには依存しません。

6

私はこの単純なルールに固執:あなたは完全に指定されたクラスを宣言するために必要なものがすべてではなく、より多くが含まれており、つまり、あなたのファイルは自給自足であることを確認し、他のソースから引っ張られているが含まに関する仮定をしません。

2

それはあなたが直接使用している定義を持つすべてのヘッダを含めることをお勧めします。それはそれの外部にあるクラスの実装に依存するようになるようなものを含めて、他のヘッダーの1つに頼っ

は、あなたのコードをより脆弱なことができます。

EDIT:

短い例:

  • クラスBは、例えば、クラスAを使用しハッシュ・メカニズムを使用するハッシュ・テーブル・インプリメンテーションB

  • 他の目的でハッシュ・テーブル(B)とハッシュ・アルゴリズム(A)を必要とするクラスCを作成します。 B.hにはそれが含まれているので、あなたはB.hを含めてA.hを除外します。

  • メアリー(あなたの同僚の一人)は、衝突の可能性を減らすこの新しい素晴らしいハッシュアルゴリズムについての論文を発見します。ただし、スペースが10%少なくて済み、倍の速さです。彼女は(正しく)クラスBを、そのアルゴリズムを実装するクラスDを使用するように書き換えます。クラスAはBではもはや必要ではないので、BhからクラスAへのすべての参照も削除する。

  • あなたのコードブレーク。

EDIT 2:

いくつかのプログラマがあります(と私は時折とき急いで、あまりにもこの罪を犯してきた)「が含ま-すべてを」ヘッダファイルを持っていることによって、この問題に対処します彼らのプロジェクトでこれは比類のない割合の名前空間汚染を引き起こすので避けるべきです。そして、はい、MSVCのwindows.hは私の意見ではこれらのケースの1つです。

関連する問題