我正在编写游戏引擎,我正在创建一些资源基类,如顶点,纹理,字体等。
现在我正在创建一些基本类,我希望将其暴露给另一个使用这些基类的程序员,例如Image(使用纹理),Text(使用字体),Models(使用顶点)等等。
游戏引擎也暴露出来,所以他们可以调用它的功能等来编写游戏。
但是我根本不希望他们访问基类,我也不希望它与他们的类冲突。 例如,他们可能想为某个内容创建一个名为“Material”的类,但我的资源已经有了一个“Material”类,我怎样才能避免冲突,甚至更好,隐藏这些基类(所以他们不要乱用它并打破了一些东西)?
编辑例如,我有曝光的类图像。 它包含 Quad 和 Texture 基类的私有实例,我的资源管理器确保始终只有其中一个被加载(所以我没有重复的纹理/四边形在记忆中。)
纹理本身具有宽度/高度,并管理加载到卡上的数据。 Quad 也是如此。
图片可确保在请求调整图片大小时,它会更改需要更改的所有内容并将数据重新上传到卡片中。
纹理和 Quad 是公开的,因为它们几乎无处不在,有模块和一些应用效果的类。
他们(其他程序员)可以使用图像作为实例,继承或作为成员,因为它管理自己,我只想暴露这个图像类,所以他们不知道有一个 Quad 和 Texture 类,并且它也不会干扰他们的类命名。
答案 0 :(得分:6)
第一个(也是最简单的)方法是将库中的所有对象封装在特定的命名空间中。
然后它变得有点复杂。如果要导出仅通过包含使用“内部类”的“公共类”,则可以使用前向声明来执行此操作,并保留指向您使用的“私有类”的指针。可以使用pimpl idiom
为行为和属性执行此操作以下是一个例子:
namespace Foo
{
class BarImpl;
class Bar
{
// ...
private:
std::unique_ptr<BarImpl> object_;
};
}
但是,如果您的“公共类”需要定义您的“私有类”(通过直接包含或继承),那么提供您的库(以源代码形式)并不是一个好方法)用户没有提供对这些支持类的“简单”访问。