7

シナリオ:

foo.h:

#include <vector>

class foo {
  public:
  std::vector<int>* getVector();

  /* ... other methods declarations ... */

}

foo.cpp:

#include "foo.h"
#include <vector>

/* ... other methods definitions using std::vector ... */

std::vector<int>* foo::getVector() {
  return new std::vector<int>();
}

.cppは、ヘッダーで将来変更される可能性のあるものから独立している必要があります。何らかの理由でクラスのインターフェースが変更され、からの依存関係を<vector>排除できる場合、.cppの他のメソッドもその包含を失うリスクがあります。

<vector>.cppと.hの両方に含めることを繰り返すのは正しいですか?この方法は理にかなっていますか、それともヘッダーに含まれているものだけに頼るべきですか?

4

4 に答える 4

17

必要なものだけを含めてください。

複数の.hファイルと複数の.cppファイルに同じヘッダーファイルを含めること自体は問題ではありません。ヘッダーガードは、ファイルを複数回含めることによる問題を軽減するのに効果的です。

同じファイルを複数回インクルードすることを避けようとすると、プロジェクト全体に必要なすべてのものを含む「メガインクルードファイル」につながるため、実際にはマイナスになる可能性があります。ヘッダーファイルを1回変更すると、すべてが再コンパイルされるため、これは悪いことです。

両方に同じファイルが含まれている.h/.cppファイルが心配な場合は、次のガイドラインに従ってください。

  • ヘッダーファイルにインクルードが必要ない場合は、CPPにのみインクルードしてください
  • ヘッダーファイルでクラス宣言が必要な場合(ただし使用されない場合)は、.hファイルで前方宣言を使用し、それをCPPファイルにインクルードします。
  • 実際にヘッダーファイル内でインクルードを使用する場合は、CPPではなくヘッダーファイルにインクルードしてください。
于 2012-07-24T21:52:45.047 に答える
1

いいえ、すべきではありません。それは目的を果たしません。冗長回線は、メリットのないコストです。

各ファイルには、必要なものだけを含める必要があります。ヘッダーとその実装の特定のケースでは、.cppの冗長な宣言は役に立ちません。関数がベクトルを返す必要がなくなるほどヘッダーが変更された場合は、とにかく.cppに再度アクセスする必要があります。

于 2012-07-24T21:52:37.947 に答える
1

.cppファイルには、ヘッダーに既に含まれているものを繰り返さずに、実装に固有のもの(実際には.cppファイルとは何か)のみを含めるだけで十分です。このようにして、誰かがあなたのコードを見ているとき、彼はあなたのコードをよりよく、よりきれいに理解することもできます。

どの依存関係が実装にのみ固有であるかを知ることは非常に役立ちます。たとえば、(インターフェイスを維持しながら)別の依存関係にアップグレード/置換する場合です。

于 2012-07-24T21:53:13.470 に答える
1

ヘッダーに含めるファイルはできるだけ少なくし、それらを必要とする.cppファイルにのみ含めてください。foo.hヘッダーファイルは、他のヘッダーファイル(この場合はvector.h)からの宣言を必要としない他の多くの.cppファイルに含まれている可能性があります。これにより、長期的にはコンパイルが長くなり、コードが不明瞭になります。

于 2012-07-24T21:55:39.037 に答える