我无法在 subclasses 中维护 base class 的状态

I can't maintain state of a base class amongst subclasses

总结

我的目标是使用 DirectX 11 编写渲染引擎。我计划以面向对象的方式编写它。 计划是编写单独的 classes。特别是一个 class 用于 shader,我可以在其中加载、编译、绑定和设置它以供使用。第二个 class 用于创建 vertex buffer,我可以在其中加载顶点、绑定缓冲区并将其设置为渲染。



我的尝试

我写了一个基础 class `A` 用于初始化 DirectX 并维护 2 个对象,`m_device` 和 `m_device_context`。然后正如我写的 `2` subclasses `B` 和 `C`。

在 class B 我创建并绑定顶点缓冲区,在 C 我编译并绑定顶点着色器。 BC 都使用 m_device 对象创建对象,m_device_context 到 bind/set 它们。

在subclassB中,我使用subclassC编译绑定shaders。 使用 subclass B 我初始化 Base class。但是在 C subclass 处,我在 m_device 上获得了内存 Access violation。这可能是因为我必须重新初始化基础 class 但我不能拥有 DirectX 对象的不同实例。


问题

我读过不推荐使用全局变量或对象,但是我该如何解决这个问题,如何维护项目中需要的全局对象?



(我的问题专门针对 C++ 实现,而不是游戏)

我无权访问该项目,但我制作了一个快速的 UML 图,我希望这有助于澄清一点

继承建立在 is-a 关系之上。大多数人误解的是,它不是从对象本身的角度来看的,而是基于对象带来的功能

在您的情况下,D3D class 的功能是初始化和分配 3D 引擎上下文。对吗?

Demo 和 Shader classes 不扩展该行为,这意味着没有 is-a 关系。

所以在您的情况下,那些 classes 需要 D3D class 才能运行。另一个解决方案可能是在 Demo 或 Shader 中根本不使用 D3D class。这取决于 D3D class 是否提供演示或着色器 class 使用的任何其他功能(方法)。

您在 classes 中公开字段时也应该非常小心,因为当您的应用程序增长时,它会变得非常令人头疼。尝试通过方法公开功能。