3

重複の可能性:
実装でヘッダーを再インクルード

私が疑問に思っているのはusing namespace xxx、グローバル名前空間を汚染しないように、ヘッダー ファイルで使用しないのが一般的であるということです。これはどうなり#includesますか?

私が持っているfoo.h場合foo.cpp

//Foo.h
#ifndef FOO_H_
#define FOO_H_

#include <string>

class Foo
{
  public:
    Foo(std::string * a, std::string * b);
    virtual ~Foo();
};

#endif /* FOO_H_ */

//Foo.cpp
#include <string>
#include <Foo.h>
Foo::Foo(std::string * a, std::string * b)
{
  // TODO Auto-generated constructor stub

}

Foo::~Foo()
{
  // TODO Auto-generated destructor stub
}

本当に#include <string>両方のファイルで必要ですか?.h または .cpp だけに含めるだけで十分ですか? (両方とも機能することはわかっていますが、何が推奨されますか?)


編集、私の質問に関するもう少し背景情報。
ヘッダー ファイルで特定のクラスを (変数またはメソッド引数として) 使用する場合は、それらをヘッダー ファイルで前方宣言し、ヘッダー ファイル自体のみをソース ファイルに含めます。しかし、クラステンプレートを前方宣言できないため、これはほとんどの STL ライブラリでは機能しませんか?

4

1 に答える 1

3

...クラステンプレートを前方宣言できないためですか?

クラス テンプレートは、非テンプレート クラスと同様に前方宣言できます。

// forward declaration
template <typename T>
class C;

ただし、@AlexandreC がコメントで述べたように、std::stringtypedefstd::stringtemplate <typename,typename,typename> basic_string;.

それが許されるなら、私はそれが複雑になると書いています。そして、それは許可されていません。以下を参照してください。

C++11 標準 17.6.4.2.1 によると:

特に指定がない限り、名前空間 std または名前空間 std 内の名前空間に宣言または定義を追加する場合、C++ プログラムの動作は未定義です。

<string>ということで、ヘッダファイルにインクルードするしかないstd::string


あなたの主な質問について-常にヘッダーファイルに含まれ、削除されないことが確実でない限り、ソースファイルとヘッダーファイルに含めます...

于 2012-11-05T21:30:41.933 に答える