C++将类添加到命名空间:原因
C++ adding class to a namespace: why?
我是c++的新手。为什么在Eclipse(使用MinGW配置)和其他线程中,我注意到它被用来向命名空间添加类?
我提供了一个例子来向你展示我的实际怀疑:
#ifndef MODEL_MANGO_HPP_
#define MODEL_MANGO_HPP_
namespace std {
class Mango {
public:
Mango();
virtual ~Mango();
};
} /* namespace std */
#endif /* MODEL_MANGO_HPP_ */
EDIT:如注释所示,完全禁止将类添加到命名空间std。引用@owacooder,
命名空间永远不会关闭,因此您始终可以添加类定义。然而,根据规范命名空间将被视为已关闭。
为了向您提供上下文的完整视图,以下是Eclipse为我完成的Mango.cpp的默认实现:
#include "Mango.hpp"
namespace std {
Mango::Mango() {
// TODO Auto-generated constructor stub
}
Mango::~Mango() {
// TODO Auto-generated destructor stub
}
} /* namespace std */
所以我的问题变成了:为什么使用"namespace std{…}"?何时向命名空间中添加类是一种好的做法
您必须了解类和名称空间的基本知识。
类(以及structs、enum和enum类)用于在C++中定义用户定义的类型。
您创建一个类来表示逻辑实体并封装细节等。
名称空间是一种标记代码区域和限定变量唯一名称的方法。
如果你只是在一个文件中写一个类,它将被写在"全局名称空间"中,这被认为是不好的做法,因为你正在"污染名称空间"。
相反,您应该使用名称空间来限制变量名称具有意义的范围。这样,就不会很快耗尽合理类和变量名的池(你想写多少次"Utility"类?)
namespace firstNamespace{
int x=2;
}
namespace secondNamespace{
int x=7;
}
int main ()
{
std::cout << firstNamespace::x << 'n';
std::cout << secondNamespace::x << 'n';
return 0;
}
在这种情况下,您可以看到,我们可以通过限定命名空间在不同的上下文中"重用"变量名称x。在名称空间块中,我们可以有更多的声明和定义。包括函数、类、结构等
不要让名称空间保持打开状态,以后可以添加这些名称空间。例如,你可以有这个:
namespace firstNamespace{
int x=2;
}
namespace secondNamespace{
int x=7;
}
namespace firstNamespace{
int y=11;
}
在这里,我们添加了firstNamespace::y。
更重要的是,您可以观察到,std是C++提供的一个命名空间,它包含许多有用的变量、对象(如std::ostream类型的cout)、函数和类(如std::vector、std::estream等)。
因此,回到您的问题,您希望将类定义封装在名称空间中的原因是为了不污染全局名称空间。
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- C++将类添加到命名空间:原因