gpt4 book ai didi

c++ - 对象层次结构的 "Implementation"- "the easiest way"或如何避免虚拟继承?

转载 作者:行者123 更新时间:2023-11-30 04:04:46 27 4
gpt4 key购买 nike

我有一些非常复杂的虚拟对象层次结构,将 3D 引擎中的所有元素表示为抽象类(接口(interface))。

例如,我有 Renderable,父级是 Sizeable(使用 getSize() 方法)。 Sizeable 继承自 Positionable (with getPosition()) 等

该结构很好且符合逻辑(例如,3D 模型是 Renderable,用于蒙皮的骨架骨骼是 Sizeable,相机只是 Positionable).

还有一个“ super 级”Engine3D

我的目标是:

我必须为那个“图形事物”(模块)编写“实现”。它将是 DirectX 的“实现”。 目标:使用我的“实现”的程序员可以快速简单地切换到其他实现(他使用的实现对他来说几乎是透明的)。

我想保持这种状态:

//choosing module "implementation" ("implementation" mentioned here only)
Engine3D * engine = new MyEngine3D();

Renderable * model = engine->createModel(...);
//line above will return MyRenderable class in fact,
//but user (programmer) will treat it as Renderable

为什么我要创建“自己的”版本的 Renderable 和所有其他版本?因为它们将共享一些特定于“实现”的数据(DirectX 结构的指针等)。

我的问题是:

但那样的话,我会创建一个“镜像”——原始模块对象层次结构的拷贝,每个类名前面都有 My。此外,MyRenderable 必须同时继承 Renderable(以覆盖 render())和 MySizeable(以获取DirectX 矩阵等)。

这涉及虚拟继承,确实使结构复杂化。

有没有更简单的方法?

我主要讲的是避免虚拟多重继承(我猜只是多重继承就可以了)。

最佳答案

你绝对应该避免对象层次结构和渲染实现的强耦合。我的建议是将所有 DirectX 特定代码移动到对象层次结构之外的类,例如 IRenderer 接口(interface)和 DirectXRenderer 实现。将对 IRenderer 的引用或指针添加到所有必须绘制内容的类(Renderable 等)。所有对象类都必须使用您自己的矩阵等实现,以使其独立于实际渲染后端的数据结构。

关于c++ - 对象层次结构的 "Implementation"- "the easiest way"或如何避免虚拟继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23598776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com