3

可能重复:
在实现中重新包含标头

我想知道的是,通常的做法是不在using namespace xxx头文件中使用,以免污染全局命名空间。这是#includes怎么回事?

如果我有foo.hfoo.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::string它会非常复杂,因为std::stringtypedef 来自template <typename,typename,typename> basic_string;.

如果允许的话,我写它会很复杂。这是不允许的,请参阅:

根据 C++11 标准,17.6.4.2.1:

如果 C++ 程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则 C++ 程序的行为是未定义的,除非另有说明。

所以,别无选择,只能包含<string>std::string.


对于您的主要问题-我会包含在源文件和头文件中,除非我很确定它会始终包含在头文件中并且永远不会被删除...

于 2012-11-05T21:30:41.933 回答