Java 包保护的 C++ 版本?

C++'s version of Java's package-protection?

我正在为 Java 中的游戏库编写图形代码。我制作了名为 com.engine.graphics 的包。在这个包中,我有一个名为 VertexArrayObject 的较低级别 class。这个 class 被客户端使用的 "client-level" classes 使用;但是,我不想让客户访问 VertexArrayObject,因为这只会让他们对我的图书馆的理解变得复杂。因此,我给了 VertexArrayObject 默认访问说明符;这样,只有 com.engine.graphics 中的 class 人可以访问它,并且还告诉客户他们不需要知道它是什么。

就像 Java 有这个标准约定一样,我认为 C++ 必须有一些标准约定来处理这个问题;但是,我的互联网搜索没有任何结果。

那么,我的问题是,约定是什么?如果没有,最好的方法是什么?

C++ 没有 'package' 的概念,因此 'package-protection' 在技术上是不可能的。 (有模块的提议,但即使在即将到来的C++17标准中也不会包含)。

有很多方法可以从外部世界隐藏 class 或限制对它的访问,在语法级别上,您可以求助于:

  • 嵌套 classes 可以声明为私有(你应该从 Java 熟悉它们,除了它们是 "static"默认且无法访问非静态封闭 class 成员)link
  • 可以访问给定 class link;
  • 的任何私有成员的
  • friend classes
  • friend functions 如果你只想限制对某些函数的访问,包括另一个函数的成员函数class;
  • private/protected 继承 其中只有 class 成员知道继承 link.

有很多 friend classes 和函数是一团糟,但有一个原因要求明确列出这些:它们破坏了封装原则。

最后,您可以使用任何一种 "private implementation" 习惯用法(又名 pimpl,又名不透明指针),它包括定义一个可见的 class 持有指向实现 class 的指针并转发所有在单独的 cpp 文件或外观设计模式中定义实现 class 时调用。

选择适合给定 class 关系的任何内容。标准库倾向于使用嵌套 classes,而流行的图形库 Qt 则依赖于 pimpl。