我已经阅读了一些关于 SO 的其他类似问题的答案,这些答案似乎表明可以隐藏命名空间(为了隐藏实现细节),但他们没有说明如何。
因此,例如,如果我想要一个namespace A
包含 a 的 a namespace B
,并且B
有一些令人讨厌的功能实现细节,A
因为我希望对最终用户隐藏这些功能,那么我可以使用某种链接器技巧,以便B
在 之外不可见A
,但是A
对程序的其余部分仍然可见?
我已经阅读了一些关于 SO 的其他类似问题的答案,这些答案似乎表明可以隐藏命名空间(为了隐藏实现细节),但他们没有说明如何。
因此,例如,如果我想要一个namespace A
包含 a 的 a namespace B
,并且B
有一些令人讨厌的功能实现细节,A
因为我希望对最终用户隐藏这些功能,那么我可以使用某种链接器技巧,以便B
在 之外不可见A
,但是A
对程序的其余部分仍然可见?
您似乎在谈论的是“Pimpl”模式和/或句柄/身体习语。或者你能想出的其他几个名字。一个非常简短的例子是在 boost Smart Pointer页面上。它解释了如何将具有不完整类型的类声明为智能指针,然后在其他地方定义实现。这对 API 用户“隐藏”了它,因为“内部”类的实现可以更改而无需库创建者以外的任何人重新编译,因为大小仅在实现中,而不在头文件中。只有“公共”类的大小是已知的,并且保持不变。通读这两个 .cpp 文件和一个 .hpp 文件,看看它为什么起作用。
我希望这与你正在尝试做的事情有关。
命名空间的目的是避免名称冲突。这基本上就是全部了。它们不提供任何隐藏任何东西的功能。尽管在一定程度上他们强迫写作namesp_name::sometinng
。这可能会让用户思考这是否值得做。
上面的评论所暗示的,基本上是将您的标头分为公共标头和私有标头。私有标头仅包含在您的 cpp 文件中,预计不会包含在上层代码中。这在许多情况下都有效,这很有帮助,但并不能解决所有问题。