3

ほとんどの場合、相互に使用する複数のクラスをプログラム内に作成する場合、混乱を減らすために必要な最小限の数のヘッダー ファイルのみを含めます。

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

これは私の悪い癖ですか?コードが読みにくくなりますか?

4

3 に答える 3

6

私はこの単純なルールに固執します。特定のクラスを完全に宣言するために必要なすべてのものを含めますが、それ以上は含めず、他のソースからプルインすることについては何も想定しません。つまり、ファイルが自給自足であることを確認します。

于 2010-12-11T09:57:22.590 に答える
4

外部インクルードの順序に依存せずにヘッダーファイルを解析するために必要なものをインクルードします(言い換えると、ヘッダーを自給自足にします)。

あなたの場合、から継承するc.haを宣言する場合は、明らかに。を含める必要があります。ただし、に表示されない場合は、含める理由はないと思います。言及しているという事実は、前方宣言またはを含めることによって、解析するために必要なものを作成する必要があることを意味します。class Cclass BB.hclass Ac.hb.hAb.hAa.h

だから私の観点から、あなたはすべきことをしているのです。

また、何らかの理由c.hで言及し始めた場合Aは、適切な包含宣言または前方宣言を追加して、それが私に代わって行われるという事実に依存しないようにすることにも注意b.hしてください。

于 2010-12-11T09:58:30.970 に答える
2

直接使用している定義を含むすべてのヘッダーを含めることをお勧めします。

他のヘッダーの1つに依存してコンテンツを含めると、外部のクラスの実装に依存するようになるため、コードがより脆弱になります。

編集:

簡単な例:

  • クラスBはクラスAを使用します。たとえば、ハッシュメカニズムAを使用するハッシュテーブル実装Bです。

  • 他の目的のためにハッシュテーブル(つまりB)とハッシュアルゴリズム(つまりA)を必要とするクラスCを作成します。とにかくBhに含まれているので、Bhを含め、Ahを省略します。

  • 同僚の1人であるMaryは、衝突の可能性を減らしながら、必要なスペースが10%少なく、速度が2倍になる、この新しいすばらしいハッシュアルゴリズムに関する論文を発見しました。彼女は(当然のことながら)そのアルゴリズムを実装するクラスDを使用するようにクラスBを書き直します。クラスAはBで不要になったため、クラスAへのすべての参照もBhから削除します。

  • コードが壊れます。

編集2:

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

于 2010-12-11T09:58:28.103 に答える