由于C ++没有像Java这样的反射,我已经构建了一组通用数据容器,可用于将数据格式化为各种格式(JSON,XML,CSV等)。我的问题是:
更好的做法是让类名保持通用并使用命名空间,或者创建没有命名空间的唯一类名吗?另外,这是解决这种反射问题的最佳方法吗?
例如:
namespace FormatContainers
{
class Object {...};
class Array {...};
class Value {...};
}
VS
class FCObject {...};
class FCArray {...};
class FCValue {...};
这些类的示例用法:
FCObject o;
o.addNVP("Name1","Value1");
o.addNVP("Name2",5);
cout << o.toString("JSON");
的产率:
{"Name1":"Value1","Name2":5}
答案 0 :(得分: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项目中使用的前缀。
答案 1 :(得分:0)
最好使用namespace
并在namespace
中创建类。我看到了namespace
:
namespace
中定义的函数具有在同一namespace
中定义的参数类型时,重载函数解析效果更好。FormatContainers::Object
比FCObject
更清晰。