C ++如何隐藏公共类?

时间:2013-09-03 18:17:54

标签: c++

我正在编写游戏引擎,我正在创建一些资源基类,如顶点,纹理,字体等。

现在我正在创建一些基本类,我希望将其暴露给另一个使用这些基类的程序员,例如Image(使用纹理),Text(使用字体),Models(使用顶点)等等。

游戏引擎也暴露出来,所以他们可以调用它的功能等来编写游戏。

但是我根本不希望他们访问基类,我也不希望它与他们的类冲突。 例如,他们可能想为某个内容创建一个名为“Material”的类,但我的资源已经有了一个“Material”类,我怎样才能避免冲突,甚至更好,隐藏这些基类(所以他们不要乱用它并打破了一些东西)?

编辑例如,我有曝光的类图像。 它包含 Quad Texture 基类的私有实例,我的资源管理器确保始终只有其中一个被加载(所以我没有重复的纹理/四边形在记忆中。)

纹理本身具有宽度/高度,并管理加载到卡上的数据。 Quad 也是如此。

图片可确保在请求调整图片大小时,它会更改需要更改的所有内容并将数据重新上传到卡片中。

纹理 Quad 是公开的,因为它们几乎无处不在,有模块和一些应用效果的类。

他们(其他程序员)可以使用图像作为实例,继承或作为成员,因为它管理自己,我只想暴露这个图像类,所以他们不知道有一个 Quad Texture 类,并且它也不会干扰他们的类命名。

1 个答案:

答案 0 :(得分:6)

第一个(也是最简单的)方法是将库中的所有对象封装在特定的命名空间中。

然后它变得有点复杂。如果要导出仅通过包含使用“内部类”的“公共类”,则可以使用前向声明来执行此操作,并保留指向您使用的“私有类”的指针。可以使用pimpl idiom

为行为和属性执行此操作

以下是一个例子:

namespace Foo
{
   class BarImpl;

   class Bar
   {
   // ...
   private:
      std::unique_ptr<BarImpl> object_;
   };
}

但是,如果您的“公共类”需要定义您的“私有类”(通过直接包含或继承),那么提供您的库(以源代码形式)并不是一个好方法)用户没有提供对这些支持类的“简单”访问。