包括标题中的(STL)头文件

时间:2012-11-05 20:49:29

标签: c++

  

可能重复:
  reincluding header in implementation

我想知道的是,通常的做法是不在头文件中使用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库,因为你无法转发声明类模板吗?

1 个答案:

答案 0 :(得分:3)

  

...因为你无法转发声明类模板?

类模板可以向前声明 - 就像非模板类一样:

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

但是,正如@AlexandreC在评论中所述,对于std::string,它会非常复杂,因为std::string是来自template <typename,typename,typename> basic_string;的typedef。

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

根据C ++ 11标准,17.6.4.2.1:

  

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

因此,除了<string>的头文件中包含std::string之外别无选择。


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