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。
我正在为 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。