0

我已经阅读了一些关于 SO 的其他类似问题的答案,这些答案似乎表明可以隐藏命名空间(为了隐藏实现细节),但他们没有说明如何。

因此,例如,如果我想要一个namespace A包含 a 的 a namespace B,并且B有一些令人讨厌的功能实现细节,A因为我希望对最终用户隐藏这些功能,那么我可以使用某种链接器技巧,以便B在 之外不可见A,但是A对程序的其余部分仍然可见?

4

2 回答 2

1

您似乎在谈论的是“Pimpl”模式和/或句柄/身体习语。或者你能想出的其他几个名字。一个非常简短的例子是在 boost Smart Pointer页面上。它解释了如何将具有不完整类型的类声明为智能指针,然后在其他地方定义实现。这对 API 用户“隐藏”了它,因为“内部”类的实现可以更改而无需库创建者以外的任何人重新编译,因为大小仅在实现中,而不在头文件中。只有“公共”类的大小是已知的,并且保持不变。通读这两个 .cpp 文件和一个 .hpp 文件,看看它为什么起作用。

我希望这与你正在尝试做的事情有关。

于 2012-07-03T23:17:07.703 回答
1

命名空间的目的是避免名称冲突。这基本上就是全部了。它们不提供任何隐藏任何东西的功能。尽管在一定程度上他们强迫写作namesp_name::sometinng。这可能会让用户思考这是否值得做。

上面的评论所暗示的,基本上是将您的标头分为公共标头和私有标头。私有标头仅包含在您的 cpp 文件中,预计不会包含在上层代码中。这在许多情况下都有效,这很有帮助,但并不能解决所有问题。

于 2012-07-03T23:20:16.920 回答