我想知道的是,通常的做法是不在头文件中使用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库,因为你无法转发声明类模板吗?
答案 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
之外别无选择。
对于你的主要问题 - 我会包含在源文件和头文件中,除非我非常确定它将始终包含在头文件中并且永远不会删除...