由于 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}
最佳答案
两种约定之间的偏好更多是个人偏好。
在名称前加前缀是 C 风格的命名约定,以防止名称冲突。例如在 OpenGL 中,所有函数都以 gl
为前缀。虽然这会创建唯一的名称,但最终可能会为函数/结构/类创建过长的名称。例如GTK+中的g_file_new_for_commandline_arg_and_cwd
GIO图书馆。
使用 namespace 是 C++ 防止名称冲突的方法。命名空间与 using 指令相结合,使您可以使名称简短明了,而不必担心与其他命名空间中的其他名称发生冲突。只要不使用 using 语句将两个具有冲突名称的 namespace 导入到同一范围内,情况就是如此。大多数 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 项目中使用的前缀。
关于C++ 唯一类名与命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729806/