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::Object
比 FCObject
更清晰。
【讨论】:
以上是关于C++ 唯一类名与命名空间的主要内容,如果未能解决你的问题,请参考以下文章