Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我能';t在子类中保持基类的状态 总结_C++_Design Patterns_Frameworks_Directx_Game Engine - Fatal编程技术网

C++ 我能';t在子类中保持基类的状态 总结

C++ 我能';t在子类中保持基类的状态 总结,c++,design-patterns,frameworks,directx,game-engine,C++,Design Patterns,Frameworks,Directx,Game Engine,我的目标是使用DirectX 11编写一个渲染引擎。我计划以面向对象的方式编写它。 计划是编写单独的类。特别是一个用于shader的类,我可以在其中加载、编译、绑定并设置它以供使用。用于创建顶点缓冲区的第二个类,我可以在其中加载顶点、绑定缓冲区并将其设置为渲染 我的尝试 我编写了一个基类'A',用于初始化DirectX并维护两个对象'm_device'和'm_device_context'。然后当我写'2'子类'B'和'C'时。 在类B中,我创建并绑定顶点缓冲区;在类C中,我编译并绑定顶点着色

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



我的尝试 我编写了一个基类'A',用于初始化DirectX并维护两个对象'm_device'和'm_device_context'。然后当我写'2'子类'B'和'C'时。 在类
B
中,我创建并绑定顶点缓冲区;在类
C
中,我编译并绑定顶点着色器。
B
C
都使用
m_设备
对象创建对象,并使用
m_设备_上下文
绑定/设置对象

在子类
B
中,我使用子类
C
编译和绑定
着色器。
使用子类
B
I初始化基类。但是在
C
子类中,我在
m_设备上获得了内存
访问冲突
。这可能是因为我必须重新初始化基类,但不能有不同的
DirectX
对象实例


问题: 我已经读到不推荐全局变量或对象,但我如何解决这个问题,如何维护项目中需要的全局对象?

(我的问题是关于C++实现,而不是游戏)

我没有访问该项目的权限,但我制作了一个快速的UML图,我希望这将有助于澄清一点
继承是建立在
is-a
关系之上的。大多数人错的是,它不是从对象本身的角度来看的,而是从对象带来的功能来看的

在您的例子中,D3D类的功能是初始化和分配3D引擎上下文。对吧?

Demo和Shader类不扩展该行为,这意味着不存在
is-a
关系

因此,在您的例子中,这些类需要D3D类能够正常工作。另一个解决方案可能是在Demo或Shader中根本不使用D3D类。这取决于D3D类是否提供演示或着色器类使用的任何其他功能(方法)


在公开类中的字段时也应该非常小心,因为当应用程序增长时,这可能会成为一个真正令人头痛的问题。尝试通过方法公开功能。

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

在您的例子中,D3D类的功能是初始化和分配3D引擎上下文。对吧?

Demo和Shader类不扩展该行为,这意味着不存在
is-a
关系

因此,在您的例子中,这些类需要D3D类能够正常工作。另一个解决方案可能是在Demo或Shader中根本不使用D3D类。这取决于D3D类是否提供演示或着色器类使用的任何其他功能(方法)


在公开类中的字段时也应该非常小心,因为当应用程序增长时,这可能会成为一个真正令人头痛的问题。尝试通过方法公开功能。

我不清楚您的类关系,但我认为继承(如果您使用的是继承)可能不是合适的工具。也许依赖注入更适用。如果您需要更多帮助,也许您可以解释哪些DirectX对象只能有一个实例(对于我们这些有一段时间没有使用DirectX的人),和/或您的确切类关系是什么以及问题发生在哪里。如果您能清除所有不必要的内容并发布一个简短的示例,这也可能会有所帮助。@scg我制作了一个快速的uml图,我希望它会有所帮助。如果您的图中的连接表示继承,那么我认为这不是您想要的。正如我前面提到的,依赖注入似乎更合理。不要使用继承,而是将处理设备和上下文的类的实例作为参数传递给其他类的构造函数。确保使用某种类型的共享所有权(例如std::shared_ptr),而不是按值传递。当然还有其他的细节要考虑,但是这是基本的想法。不可能完全隐藏一个接口的全局变量的使用(读取:污点);这里最好的方法很可能是使用您自己的全局函数来表示您不想向客户机公开的较低级别库的状态。我不清楚您的类关系,但我认为继承(如果您使用的是继承)可能不是合适的工具。也许依赖注入更适用。如果您需要更多帮助,也许您可以解释哪些DirectX对象只能有一个实例(对于我们这些有一段时间没有使用DirectX的人),和/或您的确切类关系是什么以及问题发生在哪里。如果您能清除所有不必要的内容并发布一个简短的示例,这也可能会有所帮助。@scg我制作了一个快速的uml图,我希望它会有所帮助。如果您的图中的连接表示继承,那么我认为这不是您想要的。正如我前面提到的,依赖注入似乎更合理。不要使用继承,而是将处理设备和上下文的类的实例作为参数传递给其他类的构造函数。确保使用某种类型的共享所有权(例如std::shared_ptr),而不是按值传递。当然还有其他的细节要考虑,但这是基本的想法。不可能完全隐藏一个int中的全局变量的使用(读取:污点)。