我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
当前回答
另外,请注意,您可以添加到名称空间。举个例子就更清楚了,我的意思是你可以有:
namespace MyNamespace
{
double square(double x) { return x * x; }
}
在文件square.h中,和
namespace MyNamespace
{
double cube(double x) { return x * x * x; }
}
在文件cube.h中。这定义了一个单独的名称空间MyNamespace(也就是说,您可以跨多个文件定义一个单独的名称空间)。
其他回答
在Java中:
package somepackage;
class SomeClass {}
在c++中:
namespace somenamespace {
class SomeClass {}
}
使用它们,Java:
import somepackage;
和c++:
using namespace somenamespace;
此外,全名是“somepackage”。用于Java的SomeClass和用于c++的somenamespace::SomeClass。使用这些约定,您可以像在Java中一样进行组织,包括为名称空间创建匹配的文件夹名称。但是没有文件夹->包和文件->类的要求,因此您可以根据包和名称空间独立地命名文件夹和类。
我更喜欢为应用程序使用顶级名称空间,而为组件使用子名称空间。
使用来自其他名称空间的类的方式与java中的方式惊人地相似。 你可以使用“use NAMESPACE”,这类似于“import PACKAGE”语句,例如使用std。或者你指定包作为类的前缀,用“::”分隔,例如std::string。这类似于“java.lang”。字符串”。
我所见过的大型c++项目很少使用一个以上的命名空间(例如boost库)。
实际上boost使用了大量的名称空间,通常boost的每个部分都有自己的内部工作空间,然后可能只将公共接口放在顶级名称空间boost中。
我个人认为,代码库越大,名称空间就越重要,即使在单个应用程序(或库)中也是如此。在工作中,我们将应用程序的每个模块放在自己的命名空间中。
我经常使用的命名空间的另一种用法(不是双关语)是匿名命名空间:
namespace {
const int CONSTANT = 42;
}
这基本等同于:
static const int CONSTANT = 42;
然而,使用匿名命名空间(而不是静态命名空间)是在c++中仅在当前编译单元中可见的代码和数据的推荐方式。
java和c++的另一个区别是,在c++中,名称空间层次结构不需要调整文件系统布局。因此,我倾向于将整个可重用库放在一个单独的命名空间中,并将库中的子系统放在子目录中:
#include "lib/module1.h"
#include "lib/module2.h"
lib::class1 *v = new lib::class1();
如果存在名称冲突的可能性,我只会将子系统放在嵌套的名称空间中。
注意,c++中的命名空间实际上只是一个名称空间。它们不提供Java包所提供的任何封装,因此您可能不会经常使用它们。