【问题标题】:C++, namespace best practiceC++,命名空间最佳实践
【发布时间】:2020-09-02 03:54:06
【问题描述】:

我的项目分为模块,它们都具有相似的结构,而不是编写EntityHandlerInputHandler 之类的类,我想使用命名空间并执行Input::HandlerEntity::Handler。现在这一切对我来说似乎都很好,但是这些命名空间也嵌套在另一个命名空间中,该命名空间也有一个 Handler 类!

有些人说这是不好的做法,可能会造成混淆,但作为我风格的一部分,我从不使用 using <namespace>; 关键字,所以它总是看起来很明确。你认为这是一个好的做法吗?如果不是,你能告诉我这会在哪里反过来咬我吗?

很抱歉,如果以前有人问过这个问题,我看过的地方没有很好地解释为什么或为什么不这样做!

【问题讨论】:

  • 如果命名空间的唯一目的是通过提供前缀来命名某些类:别这样。
  • 嗯,它更多的是为我的项目中的不同模块共享类名,例如我有 Entity::Handler、Entity::Instance、Entity::Tags 等......每个模块都有一个命名空间和相同的类名,这会变坏吗?
  • 请评论@MichaelUshakov的回答。

标签: c++ namespaces


【解决方案1】:

我认为完全限定命名空间而不使用 using 更好,因为它可以在阅读和/或编译代码时消除一些错误。在许多教程中,建议在函数声明中使用完全限定的命名空间,即 void doSome (std::vector& data) ,而不是使用命名空间 std + doSome (vector& data) 。完全限定命名空间是一种很好的做法,因为它可以减少编译阶段的类型解析歧义错误。考虑以下示例:

class A {
private:
    Super::Handler* _handlerOne;
    Super::Entity::Handler* _handlerTwo;
};

当你使用 using 时,很难做到这一点:

using namespace Super;
using namespace Super::Handler;

class A {
private:
    Handler* _handlerOne;  // What type compiler place here ??? , we don't know ...
    Handler* _handlerTwo;  // What type compiler place here ??? , we don't know ...
};

更少的歧义 - 更好的代码。

【讨论】:

  • 您本可以对此评论更具建设性。没有必要居高临下。
  • 我的消息是针对另一位行为不端的用户,现在他们的评论已被删除。
  • 哦,对不起,@paddy 我没听懂
  • 好吧,更外交:您的回答甚至没有尝试回答所提出的问题。
  • @Swordfish 你为什么这么认为。还有一次:问题是:“为什么或为什么不这样做!”这个词在这里的意思是 - 使用完全限定的命名空间,即 A::B 而不是使用命名空间 A + 像 B 一样声明类型。我已经演示了第二个变体可能导致编译器歧义并降低代码可读性的示例。
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2011-08-09
  • 2018-12-02
  • 2013-05-18
相关资源
最近更新 更多