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

时间:2014-09-08 17:27:47

标签: c++ json class reflection namespaces

由于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}

2 个答案:

答案 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

的以下优点
  1. 它允许您创建不会污染全局名称空间的类和函数。
  2. namespace中定义的函数具有在同一namespace中定义的参数类型时,重载函数解析效果更好。
  3. 它使创建更清晰的类名和函数名。 FormatContainers::ObjectFCObject更清晰。