0

重複の可能性:
C++ヘッダーファイルを使用するためのベストプラクティス
C++-.hファイルには何を入れる必要がありますか?

些細な問題かもしれませんが、本当に混乱しています。

  • コードエンティティをヘッダーファイルにどのように整理する必要がありますか?

たとえば、すべてのクラス宣言をヘッダーファイルに入れます。グローバルエンティティはどうですか?すべての宣言を別のファイルに入れる必要がありますか?または、関連するものをファイルに入れますか?またはそれを決定するための他のいくつかの原則?

例1

// A common header file of "common.h"
#include <vector>
#include <memory>
#include <algorithm>
#include <string>
#include <cmath>

または、必要なときにそれらを含めるだけです。

例2

// A header file "report.h" to include functions to report some information
class string;
void Log(std::string& info); // show in a log window
void Message(std::string& info); // show in a message box
void Status(std::string& info); // show in a status bar

またはそれらを3つのファイルに分割します。

4

1 に答える 1

2

最初に覚えておくべきことは、ヘッダーは他のファイルで使用するためのものであるということです。一部のサービスの利用者がそのサービスを使用するために必要な情報のみを含める必要があります。単一のソースファイル内のプログラムはヘッダーを必要としません(ただし、それが定義する関数の場合、使用する「システム」関数の場合はヘッダーが必要です)。ヘッダーは、サービスのプロバイダーとサービスのコンシューマーの間の一貫性を確保するために使用されます。

[あなたは]すべてのクラス宣言をヘッダーファイルに入れますか?

いいえ。多くのクラスがありますが、すべてのクラスではありません。

クラスがソースファイル内のコードによってのみ使用される場合、ファイル外の何もクラスについて知る必要はありません。クラスは、ヘッダーではなく、ソースファイルで指定する必要があります。

インターフェイスでクラスが使用されている場合でも、詳細な宣言が必要かどうか、またはクラスの前方宣言を提供するのに十分かどうかを慎重に検討してください。

グローバルエンティティはどうですか?

関数以外の「グローバルエンティティ」は多くないはずです。グローバル変数はできるだけ避けてください。グローバルエンティティが他のファイルで必要になる場合は、適切なヘッダーで宣言する必要がありますが、通常は、それが属するクラスを定義するヘッダーであるとは限りません。「グローバルエンティティ」が単一のファイルでのみ必要な場合は、適切な名前空間(多くの場合、匿名の名前空間)で定義する必要があります。

すべての宣言を別のファイルに入れる必要がありますか?

いいえ。グループ化します。標準C++ライブラリについて考えてみましょう。ヘッダーの多くは、複数の宣言を定義しています。ただし、各ヘッダーは関連する宣言のセットを定義します。すべてを異なるヘッダーに分割することと、何も見つからないほど多くのヘッダーを使用することのバランスを取りたいと考えています。

最初の経験則は、「サービスを定義するソースファイルごとに1つのヘッダー」です。ただし、慎重に使用する必要があります。

サービスの完全なセットを実装するために複数のソースファイルが必要な場合、単一のヘッダーがサービスの完全なセットの外部定義を提供する場合があります(サービスを実装するソースファイルによってのみ使用される2番目のプライベートヘッダーが存在する可能性があります) 、消費者と共有せずに、彼らが彼ら自身の間で共有する必要がある詳細を定義する)。

もう一方の極端な例では、ソースファイルがいくつかのサービスセットを実装する場合があります。これらのサービスが密接に関連していない場合、それは珍しいことです—悪いエンジニアリング。それらが関連している場合は、単一のヘッダーで十分です。1つのソースファイルに対して2つのパブリックヘッダーを持つことができると思いますが、状況は非常にまれです。

于 2013-01-27T18:49:10.090 に答える