【问题标题】:C++ How can I hide a public class?C ++如何隐藏公共类?
【发布时间】:2013-09-04 02:42:02
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您可以通过将构造函数或析构函数设为公共或私有来隐藏它们。这至少可以防止(非法)实例化。
  • 将内容设为私有并使用公共 getter 和 setter?
  • 您到底想防止什么?有人在应该使用从 Material 派生的类时意外使用了 Material 类?或者您是否有一个在引擎之外“不存在”的 Material 类,只是不希望用户的类与 Material 发生冲突?
  • 我试图阻止访问我的引擎用来管理它的基类,如果他们访问它,他们可能会更改他们的 ID(将完全弄乱我的资源模块中的 ID 设置/查找) ,或者更改一些不应该直接更改的数据或参数。我正在创建的基类执行所有必需的功能,然后更改参数,这是我想要公开的唯一类。其他基类需要公开,因为它们也可以从其他模块访问。

标签: c++


【解决方案1】:

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

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

这是一个例子:

namespace Foo
{
   class BarImpl;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多