【问题标题】:C++ Best Practice - Define classes in multiple namespaces [closed]C++ 最佳实践 - 在多个命名空间中定义类 [关闭]
【发布时间】:2018-12-02 09:15:46
【问题描述】:

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

namespace A
{
class MyT{};
}

namespace B
{
using A::MyT;
}

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

提前谢谢你

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

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

    我会尽量保持我的回答没有意见。

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

    当且仅当这是有意的(例如陈述意图),才认为它对您的项目有益。

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

    【讨论】:

      【解决方案2】:

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

      例子:

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

      您是否应该在实际项目中这样做取决于您认为与A::MyT 存在某种命名冲突的可能性有多大。一般来说,我会说避免它。如果有的话,必须写 A::MyT 而不是 MyT 可以提高可读性,因为它让读者很清楚您指的是 MyT

      【讨论】:

      • 如果项目很大,其实可以提高可读性。
      • @Attersson 是的,我将其添加到答案中。
      • 是的,确实存储是错误的措辞。在这种情况下使用的目的不是缩短声明,而是使其在不同的上下文中更具可读性,以便在某些地方可以将其称为 A::MyT,而在其他地方称为 B::MyT,具体取决于什么是用户上下文中类的逻辑含义
      • @Triskeldeian 对我来说听起来不太可读。
      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 2014-07-21
      • 2010-11-17
      • 2011-01-07
      • 2010-10-03
      • 2011-07-23
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多