C ++クラスヘッダーファイルの構成
-
19-08-2019 - |
質問
複数のソースファイルとヘッダーファイルにまたがる多数の相互依存クラスを処理する必要がある人々に推奨するC ++コーディングおよびファイル編成のガイドラインは何ですか?
プロジェクトにこのような状況があり、いくつかのヘッダーファイルにまたがるクラス定義関連のエラーを解決するのは非常に頭痛の種になりました。
解決
一般的なガイドライン:
- インターフェースを実装とペアにします。
foo.cxx
がある場合、そこで定義されているすべてのものをfoo.h
で宣言する方がよいでしょう。 - すべてのヘッダーファイルに、独立したコンパイルに必要な他のすべてのヘッダーまたは前方宣言が含まれていることを確認します。
- <!> quot; everything <!> quot;を作成する誘惑に抵抗します。ヘッダ。彼らは常に道を迷っています。
- 関連する(相互依存する)機能のセットを単一のファイルに入れます。 Javaおよびその他の環境では、ファイルごとに1つのクラスが推奨されます。 C ++では、多くの場合、ファイルごとに1つのセットクラスが必要です。コードの構造に依存します。
- 可能な限り、
#include
sよりも前方宣言を優先します。これにより、循環ヘッダーの依存関係を解消できます。基本的に、別々のファイルにまたがる周期的な依存関係の場合、次のようなファイル依存関係グラフが必要です。-
A.cxx
にはA.h
およびB.h
が必要です
-
B.cxx
にはinclude/
およびsrc/
が必要です
- <=>には<=> が必要です
- <=>は独立しています(および<=>で定義された前方宣言クラス)
-
コードが他の開発者が使用するライブラリーである場合、実行する必要がある追加の手順がいくつかあります:
- 必要に応じて、<!> quot; private headers <!> quot;の概念を使用します。つまり、いくつかのソースファイルに必要なヘッダーファイルですが、パブリックインターフェイスには必要ありません。これは、一般的なインライン関数、マクロ、または内部定数を持つファイルです。
- ファイルシステムレベルで、パブリックインターフェイスとプライベート実装を分離します。私はCまたはC ++プロジェクトで<=>および<=>サブディレクトリを使用する傾向があります。<=>にはすべてのパブリックヘッダーがあり、<=>にはすべてのソースがあります。およびプライベートヘッダー。
John Lakosの本 Large-Scale C ++ Software Design のコピーを見つけることをお勧めします。それはかなり多額の本ですが、物理的なアーキテクチャに関する彼の議論のいくつかをざっと読むだけで、あなたは多くを学ぶでしょう。
他のヒント
NASA Goddard Space Flight CenterでCおよびC ++コーディング標準を確認してください。私がC標準で特に注意し、自分のコードで採用した1つのルールは、ヘッダーファイルの「スタンドアロン」性を強制するルールです。ヘッダーxxx.hの実装ファイルxxx.cppで、xxx.hが最初に含まれるヘッダーであることを確認します。ヘッダーが自己完結型でない場合、コンパイルは失敗します。これは美しくシンプルで効果的なルールです。
失敗するのは、マシン間で移植し、xxx.hヘッダーに<pqr.h>
などが含まれている場合だけです。ただし、<abc.h>
には、ヘッダーdef.h
元のプラットフォーム(したがって<def.h>
には<=>が含まれます)が、他のプラットフォームの<=>によって機能が使用可能になりません(代わりに<=>にありますが、<=>には<=>は含まれません)。これはルールの誤りではなく、ルールに従えば問題の診断と修正がより簡単になります。
ここに他のポイントに加えてもう1つのポイント:
プライベート定義を含めないでください インクルードファイル内。例えば。どれか でのみ使用される定義 xxx.cppはxxx.cppにあるべきであり、 xxx.h
明らかなようだが、私はそれを見る 頻繁に。
よく見落とされがちな1つの非常に優れたプラクティス(CとC ++の両方)を追加したいと思います:
foo.c
#include "foo.h" // always the first directive
その他の必要なヘッダーが後に続き、コードが必要です。ポイントは、とにかくこのコンパイルユニットのヘッダーがほぼ常に必要であり、最初のディレクティブがヘッダーが自給式であることを保証するようにヘッダーを含めることです(そうでない場合はエラーが発生します)。これは、特に公開ヘッダーに当てはまります。
このヘッダーを含める前に何かを置く必要がある場合(もちろんコメントを除く)、何か間違ったことをしている可能性があります。自分が何をしているのか本当にわかっていない限り...ハックにコメントしてください!