【问题标题】:Proper use of c++ namespace正确使用 c++ 命名空间
【发布时间】:2020-05-10 21:22:57
【问题描述】:

我是 C++ 新手,我有一个项目,其中有几个类被分成单独的头文件和源文件。

其中一些类可以访问共享实用程序方法来验证键盘输入,这将非常方便。这是因为我不希望类方法被冗长的、相同的代码处理输入流/缓冲区等堵塞。

我发现this answer 为此类问题推荐命名空间,但我不明白如何将命名空间合并到我的项目中。

比如说我有

// Utility.h
namespace utility {
  method1() {...}
  method2() {...}
  etc..
}

这样做是否不合适:

// Foo.h
#include "Utility.h"
class Foo {
  void bar();
}

// Foo.cpp
#include "Foo.h"
void foo::bar {
  ..do stuff..
  utility::method1()
  ..do more stuff..
}

“Foo”实际上可能是几个使用实用程序相同的类?

我的意图:我有兴趣仅在类方法的主体中使用实用方法,以使代码在多个类方法中发生相同检查时更具可读性。

编辑:添加了我参考过的问题

【问题讨论】:

  • 为什么会不合适?到底是什么问题?
  • 我想知道这种命名空间的使用是否存在问题(编译器?风格?)。我见过的文档并没有将命名空间作为我上面建议的一种方式(对于我非常未经训练的眼睛)。只是想小心点。
  • 好奇它们还能如何被使用?命名空间的“这种使用”有什么特别之处?我并没有真正关注你的担忧。

标签: c++ namespaces


【解决方案1】:

是的,您可以在命名空间中定义函数,然后您可以在程序的不同部分使用这些函数,是的,您就是这样称呼它们的。

不,使用命名空间没有样式或编译器问题。

【讨论】:

  • 我会尽快接受这个答案,但你能告诉我我提议的内容和在命名空间声明中包装类名之间的区别,就像我引用的 SE 问题?
  • @M-Wi 顺便说一句,您似乎误读了链接页面。该问题有一个类(仅),并且接受的答案(仅)在命名空间中具有实用程序功能,就像您在此处所做的那样。那里没有“将类名包装在命名空间声明中”。
【解决方案2】:

完全没问题。 你甚至可以这样做:

void foo::bar {
  using namespace utility;
  method1():
  ..do more stuff..
}

如果 .cpp 需要包含许多标头(以及它们各自的命名空间),它可以帮助您的读者更好地了解在您的哪些函数中使用了哪个命名空间。

您不应该做的唯一事情是 .h 中的 using namespace,因为这样做会迫使任何使用您的 .h 的人也使用您“使用”的命名空间。

【讨论】:

  • 隐藏命名空间的使用如何“帮助您的读者更好地理解在您的哪些函数中使用了哪个命名空间”?我想说的恰恰相反。
  • 隐藏命名空间的使用是什么意思?如果您需要重构其中一些函数,则有助于了解它们依赖于哪些函数(从哪个命名空间获取这些函数)。当只有几个命名空间在使用时可能很明显,对于几十个命名空间则不那么明显。
  • 是的,除了现在你必须遍历整个函数,试图找出哪个命名空间与哪个函数调用对应。你得到了什么?
  • 如果您需要知道,任何 IDE 都会告诉您哪个函数来自哪个命名空间。函数开头的 using 是编写者的助手(无需在每个函数调用之前指定命名空间),并提示可能需要重构此函数的人:此函数使用的所有命名空间在开头声明功能。我感觉您的 cmets 通常是关于 using ... 的使用,而不是使用“范围”缩小到给定功能的事实。这可能值得一个专门的帖子:-)
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2014-07-17
  • 2013-12-02
相关资源
最近更新 更多