2

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

现在我正在创建一些我希望向使用这些基类的其他程序员公开的基本类,例如 Image(使用纹理)、Text(使用字体)、Models(使用顶点)等

游戏引擎也暴露在外,因此他们可以调用它的函数等来编写游戏。

但我根本不希望他们访问基类,我也不希望它与他们的类发生冲突。例如,他们可能想为游戏中的某些东西创建一个名为“Material”的类,但我的资源已经有一个“Material”类,我怎样才能避免冲突,甚至更好地隐藏这些基类(这样它们就不会弄乱它并打破一些东西)?

编辑:例如,我有公开的类Image。它包含QuadTexture基类的私有实例,我的资源管理器确保始终只加载其中一个(因此我在内存中没有重复的纹理/四边形)。

纹理本身具有宽度/高度,并管理加载到卡中的数据。Quad 也一样。

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

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

他们(其他程序员)可以使用Image作为实例、继承或成员,因为它管理自己,我只想公开这个Image类,所以他们不知道有QuadTexture类,而且它也没有不要干扰他们的班级命名。

4

1 回答 1

6

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

然后它变得有点复杂。如果您要导出仅通过包含使用“内部类”的“公共类”,则可以使用前向声明来做到这一点,并保留指向您使用的“私有类”的指针。这可以使用pimpl idiom为行为和属性完成

这是一个例子:

namespace Foo
{
   class BarImpl;

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

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

于 2013-09-03T18:24:04.713 回答