【问题标题】:Classes with same name in different namespace不同命名空间中同名的类
【发布时间】:2016-10-25 22:23:44
【问题描述】:

我正在编写一个库。有两个同名的类但每个类都在不同的命名空间中是不是一个坏主意?

使用名称空间:

//forward declaration
namespace sparse {
    class matrix;
}
namespace dense {
    class matrix;
}

namespace dense {
    typedef Index uint64_t;
    class matrix {
        public:
        sparse::matrix tosparse();
    };
}

namespace sparse {
    typedef Index uint32_t;
    class matrix {
        dense::matrix todense();
    };
}

或者,我可以使用长名称:

class sparse_matrix
...

【问题讨论】:

  • 你相信图书馆的用户不是using namespace *;吗?如果答案是no,那么就不是很安全了。我只会使用长名称。反正也没那么长。
  • 扩展@DeiDei 所说的内容,这实际上取决于使用情况。在我看来,很多时候它们可能会一起使用,而且dense::matrixsparse::matrixdense_matrixsparse_matrix 长。
  • 就我个人而言,我会给长命名空间起别名,并且在使用库时永远不会使用using namespce *;。但我想这可能会发生......
  • @DeiDei 如果用户说using namespace whatever;,他们只能为随之而来的任何混乱负责。

标签: c++ namespaces naming


【解决方案1】:

总的来说,这很好。这正是命名空间的用途。在此示例中,不清楚设计目标是什么,因此不清楚这是否是对命名空间的适当使用。

【讨论】:

  • 我正在尝试将名称空间设置为 1。使使用库更容易,因为用户可以将 aaa::bbb::ccc 之类的名称空间别名为 abc。 2. 使编写库涉及更少的输入,因为在aaa_rangeaaa_iterator 等中重复aaa_Index_type 十几次并不好玩。使用命名空间,它只是一个命名空间中的aiteratorIndex_type。我现在将aaa::bbb::ccc 改回aaa_bbb_ccc,然后在aaa_range 中使用公共typedef aaa_Index_type Index_type。像aaa_bbb_simd_parallel这样长的类名,写起来不方便,用起来也不方便,还是个问题。
  • cpp 核心指南说将辅助函数放在与主类相同的命名空间中是个好主意 (github.com/isocpp/CppCoreGuidelines/blob/master/…)。我想我会将主类和辅助类放在同一个名称空间中。
【解决方案2】:

是的,这是个坏主意。

  1. 可以包含多个命名空间。所以这相当于写 sparse::matrix 与 dense::matrix。
  2. 清晰为王。 sparse_matrix 讲述了该对象的行为。
  3. 它们为客户端提供类似/相同的实用程序。为什么要使用不同的命名空间?

如果您希望它们有一个共同的基础,请进行继承(抽象与否)。

【讨论】:

  • 就像sparse_matrix_stride_rangesparse_matrix_stride_iteratorSparse_matrix_index_typeSparse_matrix_capacity.colSparse_matrix::Sparse_matrix(const Sparse_matrix_capacity& capacity); 等...但我同意,缺点太糟糕了,至少对用户而言.
  • @throw_away_account 这是一个不同的问题。您总是可以引入 typedef 或使用声明来简化它。
  • 但是这里支持使用命名空间:softwareengineering.stackexchange.com/questions/50120/… 我发现嵌套命名空间很难维护,因为前向声明几乎是不可能的。
  • 在我看来,命名空间的目的是避免不必要的后缀和前缀,这些后缀和前缀通常在 C 中用于避免冲突。我认为您对这个特定示例的权利是正确的,但作为一般原则,我不同意。命名空间很棒,因为矩阵可以只是矩阵。
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2011-05-29
  • 2022-12-31
  • 2018-11-20
  • 2020-05-02
  • 2019-03-01
  • 2011-12-01
相关资源
最近更新 更多