C ++最佳做法-在多个名称空间中定义类

时间:2018-06-22 21:09:00

标签: c++ namespaces

在C ++中,您可以声明一个类,然后使用以下语法在多个名称空间中插入其名称

namespace A
{
class MyT{};
}

namespace B
{
using A::MyT;
}

让我们假设我的代码中的A和B代表不同类别的类别,而不仅仅是类别的子集,而MyT实际上是属于这两个类别的类别。 像我展示的那样在两个命名空间中定义类名称是否被认为是一种好习惯? 这种技术有潜在的缺点吗?

提前谢谢

编辑: 在这种情况下使用的目的不是缩短声明,而是使其在不同的上下文中更具可读性,以便在某些地方将其称为A :: MyT,在其他地方将其称为B :: MyT,具体取决于类在用户上下文中的逻辑含义。 例如,如果MyT代表一扇门并且是一个形状对象,其接口在Geometry命名空间中定义,但在Building命名空间的上下文中使用,则在某些情况下,将其用作Geometry :: MyT是有意义的,在其他情况下作为Building :: MyT。 当然,为了减少混乱的机会,我在类以其原始名称空间声明的同一标头中声明了名称空间注入

2 个答案:

答案 0 :(得分:4)

您不是在两个命名空间中“存储”该类。您只是允许在MyT中使用namespace B,而不将其限定为A::MyT

示例:

namespace B
{
    using A::MyT;
    MyT myt;     // refers to A::MyT
}

在实际项目中是否应该这样做取决于您认为与A::MyT发生某种命名冲突的可能性。通常,我会说避免这样做。如果有的话,必须写A::MyT而不是MyT可以提高可读性,因为它使读者清楚地知道您指的是哪个MyT

答案 1 :(得分:1)

我将尽量保持无意见。

在另一个名称空间中使用一个不相交的名称空间,会创建依赖关系并进行一些硬编码,因为您需要知道所使用的名称空间名称。

当且仅当这是故意的(例如,说明意图)时,才认为对您的项目有好处。

实际上,名称空间旨在避免命名冲突。它将确保您正在访问正确的实体。