C++如何隐藏公共类

C++ How can I hide a public class?

本文关键字:隐藏 何隐藏 C++      更新时间:2023-10-16

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

现在我正在创建一些基本类,我想向另一个使用这些基本类的程序员公开,例如图像(使用纹理)、文本(使用字体)、模型(使用顶点)等

游戏引擎也是公开的,所以他们可以调用它的函数等来编码游戏。

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

编辑:例如,我有暴露的类图像。它包含QuadTexture基类的私有实例,我的资源管理器确保始终只加载其中一个(这样我在内存中就不会有重复的纹理/Quad)。

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

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

纹理四边形是公共的,因为它们几乎在任何地方都使用,有模块和一些类可以对其应用效果。

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

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

然后它变得有点复杂。如果您导出的"公共类"只是通过包含使用"内部类",则可以使用前向声明,并保留指向您使用的"私有类"的指针。可以使用皮条习语对行为和属性执行此操作

这里有一个例子:

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

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