【问题标题】:Restrict functions to namespace将函数限制在命名空间
【发布时间】:2018-04-24 04:53:29
【问题描述】:

我正在构建某种神经网络库。由于我以前从未构建过任何库,因此我对样式有一些疑问。
在我的项目中,例如有以下类:

NeuralNetwork, Layer, Util

全部在一个命名空间中。现在,LayerUtil 需要有一些公共函数,因为它们将在 NeuralNetwork 中调用。但是由于NeuralNetwork 是唯一一个应该可供“世界其他地方”访问的类(顺便说一句。创建单个Layer 对象没有任何意义)。

那么有什么方法可以让我只能在该命名空间的其他类中使用这些函数吗?还是有更优雅的方法?我想过扩展类并只制作私有函数,但这没有任何意义,并且会使代码更丑陋,因为主类不是从其他类派生而是利用它们。

【问题讨论】:

  • 了解生产质量库的作用的最佳方法是检查它们。
  • 我所说的是否是您应该解决的问题?还是你只是忍受它并希望没有人会想到用它做奇怪的事情。
  • @po0l:如果您在Util.h 中定义了Util,并且您在NeuralNetwork.cpp 中只使用Util.h 而不是NeuralNetwork.h,则不需要将Util.h 分发给您的用户。即使您提供了完整的源代码,只将公共标头放在 include/ 中并将实现内部标头保留在 src/ 中的情况并不罕见。
  • 你不能阻止人们做他们不应该做的事情。所以俗话说,保护他们免受墨菲,而不是马基雅维利。做到这一点,这样他们就不会意外编写损坏的代码。但不要担心他们可能有任何意图在脚下开枪。举个例子,boost 库将实现细节放入内部 boost::detail 命名空间。当然,如果人们有勇气,他们可以访问它。但负责任的成年人不会被那里的任何东西伤害。
  • @po0l:是的,忍受它并希望。但除了希望之外,还要编写清晰的文档,告诉客户只使用那些打算公开的类,并将内部类放入他们自己的命名空间中,并使用描述性名称,如detailimplementation

标签: c++ class namespaces


【解决方案1】:

听起来您正在寻找匿名命名空间。有点奇怪的名字,我承认。

基本上,在以下代码中,foo可用于 .cpp 文件的其余部分:

namespace {
  class Foo { public: Foo(int) {} } ; 
}

在幕后,编译器将创建一个唯一的名称,它不会与任何其他命名空间发生冲突——甚至不会与其他库的匿名命名空间发生冲突!你不在乎那个隐藏的名字。在您的 .cpp 文件中,您可以直接使用 Foo

【讨论】:

  • 并且整个库必须在一个 .cpp 文件中?
  • @KjellGunnar:不,但请注意库中的每个 .cpp 文件都有自己的匿名命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多