C++ 唯一类名与命名空间

Posted

技术标签:

【中文标题】C++ 唯一类名与命名空间【英文标题】:C++ Unique Class Names vs. Namespace 【发布时间】:2014-09-08 17:27:46 【问题描述】:

由于 C++ 不像 Java 那样具有反射功能,因此我构建了一组通用数据容器,可用于将数据格式化为各种格式(JSON、XML、CSV 等)。我的问题是这样的:

让类名通用并使用命名空间是更好的做法,还是在没有命名空间的情况下创建唯一的类名?另外,这是解决这个反射问题的最佳方法吗?

例如:

namespace FormatContainers

    class Object ...;
    class Array ...;
    class Value ...;

class FCObject ...;
class FCArray ...;
class FCValue ...;

这些类的示例用法:

FCObject o;
o.addNVP("Name1","Value1");
o.addNVP("Name2",5);
cout << o.toString("JSON");

产量:

"Name1":"Value1","Name2":5

【问题讨论】:

来自“Python 之禅”:“命名空间是一个非常棒的想法——让我们做更多这样的事情!”。也应该有一个“C ++禅”:) 【参考方案1】:

两种约定之间的偏好更多的是个人偏好。

为名称加前缀是 C 风格的命名约定,以防止名称冲突。比如在 OpenGL 中所有函数都以gl 为前缀。虽然这会创建唯一名称,但最终可能会为函数/结构/类创建过长的名称。如GTK+GIO库中的g_file_new_for_commandline_arg_and_cwd

使用命名空间是防止名称冲突的 C++ 方法。命名空间与 using 指令相结合,使您可以保持名称简短而切题,而不必担心与其他命名空间中的其他名称发生冲突。只要没有使用 using 语句将具有冲突名称的两个命名空间导入同一范围,这是正确的。大多数 C++ 编译器通过以类似于 C 中的前缀的方式为命名空间名称添加前缀来破坏源中给出的名称。

不明确的名称:

namespace N1 
    class Test 
    ;


namespace N2 
    class Test 
    ;


using namespace N1;
using namespace N2;

Test t2; // Which Test class should be used?

同样,两种约定都不比另一个“更好”。无论您的项目指南要求哪种约定,它都是您喜欢的约定。在大多数情况下,您会看到 C++ 项目中使用的命名空间和 C 项目中使用的前缀。

【讨论】:

【参考方案2】:

最好使用namespace 并在namespace 中创建类。我看到拥有namespace 的以下优势:

    它允许您创建不污染全局命名空间的类和函数。 当namespace 中定义的函数具有也在同一namespace 中定义的参数类型时,重载函数解析效果更好。 它使创建的类名和函数名更清晰。 FormatContainers::ObjectFCObject 更清晰。

【讨论】:

以上是关于C++ 唯一类名与命名空间的主要内容,如果未能解决你的问题,请参考以下文章

类名可以用作命名空间吗?

9.类名与命名空间

c++之命名空间(namespace)

c++之命名空间(namespace)

c++之命名空间(namespace)

C++ 中未命名命名空间的使用