2011-12-02 5 views
2

私はC++プロジェクトでカスタムライブラリを使用していますが、いくつかのstdヘッダーが含まれていますが、メインファイルに対応するヘッダーを含めると、カスタム1。
カスタムヘッダーファイル:
再帰(?)#include宣言を避ける

#ifndef CUSTOM_H 
#define CUSTOM_H 

#include <vector> 

//stuff 

#endif 

MAIN.CPP:

#include <iostream> 
#include "custom.h" 

//here, let suppose that i do next: 
vector<int> vec; 

return 0; 

ベクトルヘッダが含まれているようにはコンパイルエラーが、ありません、私はそれを避けたい、どんな明確にする
提案

+0

大丈夫、ありがとう、ありがとう。 – dario

答えて

5

custom.hstd::vectorの使用は実装の詳細です(また、あなたが定義したもののシグネチャには公開されていません)。ヘッダー)では、#include <vector>を対応するcustom.cppファイルに移動することを検討してください。

custom.hからインクルードを移動できない場合、たとえば、ベクターをメソッドの内外に渡すため、これは本当にインターフェイスの一部であり、ヘッダーのクライアントはそのことを知る必要があります。

0

でも可能ですが、これはファイルをインクルードする順番を意味するため、考慮しないでください。つまり、ファイルの順序によってはコンパイルできません。 #includesが入っています。一般にそのような状況を避けることが望ましいです。

これを実現するには、.hから#include <vector>を削除し、Main.cppに追加します。上記のに、カスタムヘッダーファイルを含めます。それを#includeすると、型が未定義であると不平を言うでしょう。また、カスタムヘッダーファイルを使用するすべてのファイルでは、#include <vector>最初ににする必要があります。

0

問題はほとんど避けられません。何らかの理由でヘッダファイルに別のヘッダファイルを含める必要がある場合、後でそのヘッダファイルを "uninclude"する方法はありません。

問題を最小限に抑える方法として、pimpl idiom or opaque pointerがあります。クラスの実装をプライベートソースファイルに移すことによって、最初にヘッダをインクルードするようにした依存関係を排除します。

関連する問題