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



由于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+GIO库中的CCD_ 2。

使用名称空间是防止名称冲突的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项目中所使用的前缀。

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

  1. 它允许您创建不会污染全局名称空间的类和函数
  2. 当在namespace中定义的函数具有也在同一namespace中定义的参数类型时,重载函数解析效果更好
  3. 它有助于创建更清晰的类名和函数名。FormatContainers::Object是一个比FCObject更清晰的名称

相关内容

  • 没有找到相关文章

最新更新