【问题标题】:C++'s version of Java's package-protection?C++ 版本的 Java 包保护?
【发布时间】:2016-03-15 03:05:33
【问题描述】:

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

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

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

【问题讨论】:

  • 我不认为有什么相同,但是有Friend classes。
  • 查看PIMPL Idiom
  • 这取决于客户端类如何使用它们。你能说得更具体点吗?
  • @Galik,假设 com.engine.graphics 中有一个 ShapeRenderer 类,客户可以使用它来绘制基本形状。这个 ShapeRenderer 类以某种与客户端无关的方式使用 VertexArrayObject;因此,我希望客户端能够访问 ShapeRenderer 而不是 VertexArrayObject。
  • 嗯,这并不能告诉我比你在问题中已有的更多信息。但是,老实说,您的客户端程序员应该只对您发布的文档进行编程。无论文档中说什么是自找麻烦,任何他们碰巧找到的东西都不管不顾地寻找你的头文件。无论你做什么来拯救他们,他们都可能会给自己带来麻烦。

标签: c++ access-specifier


【解决方案1】:

C++ 没有“包”的概念,因此在技术上没有“包保护”是可能的。 (有一个关于模块的提议,但它甚至不会包含在即将发布的 C++17 标准中)。

有很多方法可以从外部世界隐藏类或限制对它的访问,在语法级别上你可以诉诸:

  • 嵌套类,可以声明为私有(你应该熟悉 Java 中的它们,除了它们默认是“静态的”并且不能访问非静态封闭类成员)link;
  • 朋友类可以访问给定类link的任何私有成员;
  • 友元函数如果你想限制对某些函数的访问,包括另一个类的成员函数;
  • 私有/受保护的继承,只有类成员知道继承link。

拥有很多友元类和函数是一团糟,但需要明确列出它们是有原因的:它们违反了封装原则。

最后,您可以使用“私有实现”习语(又名 pimpl,又名不透明指针),包括定义一个可见类,该类持有指向实现类的指针,并在实现类在单独的 cpp 中定义时转发所有调用文件或外观设计模式。

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

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 2011-04-02
    • 2013-11-13
    • 1970-01-01
    • 2015-08-11
    • 2015-02-16
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多