C ++的Java版本的软件包保护?

时间:2016-03-15 03:05:34

标签: c++ access-specifier

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

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

所以,我的问题是,惯例是什么?如果没有,那么最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

C ++没有“包”的概念,因此在技术上没有“包保护”。 (模块有一个命题,但即使在即将推出的C ++ 17标准中也不会包含它。)

有许多方法可以将类从外部世界隐藏起来或限制对它的访问,在语法层面上你可以诉诸:

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

拥有很多朋友类和函数是一团糟,但有理由要求明确列出这些:它们打破了封装原则。

最后,你可以使用“私有实现”idiom(又名pimpl,又名opaque指针),它包含定义一个包含指向实现类的指针的可见类,并转发所有调用,而实现类是在一个单独的cpp中定义的文件或外观设计模式。

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