我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
当前回答
java和c++的另一个区别是,在c++中,名称空间层次结构不需要调整文件系统布局。因此,我倾向于将整个可重用库放在一个单独的命名空间中,并将库中的子系统放在子目录中:
#include "lib/module1.h"
#include "lib/module2.h"
lib::class1 *v = new lib::class1();
如果存在名称冲突的可能性,我只会将子系统放在嵌套的名称空间中。
其他回答
我更喜欢为应用程序使用顶级名称空间,而为组件使用子名称空间。
使用来自其他名称空间的类的方式与java中的方式惊人地相似。 你可以使用“use NAMESPACE”,这类似于“import PACKAGE”语句,例如使用std。或者你指定包作为类的前缀,用“::”分隔,例如std::string。这类似于“java.lang”。字符串”。
java和c++的另一个区别是,在c++中,名称空间层次结构不需要调整文件系统布局。因此,我倾向于将整个可重用库放在一个单独的命名空间中,并将库中的子系统放在子目录中:
#include "lib/module1.h"
#include "lib/module2.h"
lib::class1 *v = new lib::class1();
如果存在名称冲突的可能性,我只会将子系统放在嵌套的名称空间中。
一般来说,如果我认为一段代码可能与其他库有函数或类型名称冲突,我会为它创建一个名称空间。它也有助于品牌代码,ala boost::。
命名空间本质上是包。它们可以这样使用:
namespace MyNamespace
{
class MyClass
{
};
}
然后在代码中:
MyNamespace::MyClass* pClass = new MyNamespace::MyClass();
或者,如果你想总是使用一个特定的名称空间,你可以这样做:
using namespace MyNamespace;
MyClass* pClass = new MyClass();
编辑:按照bernhardrusch所说,我倾向于不使用“使用名称空间x”语法,我通常在实例化对象时显式指定名称空间(即我展示的第一个示例)。
正如下面所要求的,您可以使用任意数量的名称空间。
@marius
是的,你可以同时使用几个命名空间,例如:
using namespace boost;
using namespace std;
shared_ptr<int> p(new int(1)); // shared_ptr belongs to boost
cout << "cout belongs to std::" << endl; // cout and endl are in std
[2014年2月-(真的有那么长时间吗?):正如乔伊在下面指出的,这个特殊的例子现在是模棱两可的。Boost和std::现在各有一个shared_ptr.]