gpt4 book ai didi

c++ - 访问其他类变量的最佳方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:32 25 4
gpt4 key购买 nike

我现在正在为我们的引擎编写一个 Direct3D 渲染器。

问题来了:
在 OpenGL 中,我可以很容易地调用 glClearColor() 来清除。
在 Direct3D 中,我需要使用 g_pd3dDevice 来调用 ClearRenderTargetView() 来清除。

我们引擎的设计是这样的:

class Renderer
{
// ...
}

class Direct3dWin32 : public Renderer
{
private ID3D10Device* g_pd3dDevice;
}

class OpenGLWin32 : public Renderer
{
// Nothing, I can call a function easily without relying on something
}

当我的 ShaderManager 类想要编译着色器时,问题就出现了。我需要使用 direct3dWin32 类中的 g_pd3dDevice

我的问题是,解决这个问题的最佳方法是什么?我在考虑全局变量、单例类,或者只是在函数中传递类。

最佳答案

首先,我不得不注意到 g_pd3dDevice,它不是全局的。它是指向设备的 COM 接口(interface) ID3D10Device* 的类成员指针,在这里它不是全局的,也不应该是全局的。

并尽可能简单地回答您的问题(因为它看起来像是一个初学者引擎/框架设计问题),提供访问器方法,该方法返回一个指向工作设备的指针,它可以从该工作设备进一步传递到需要的地方就业。

符合您楼上的小“规范”的简单示例:

class Direct3DWin32 : public Renderer
{
ID3D10Device* pD3DDevice;
public:
ID3D10Device* getD3DDevice();

}

现在,只要您需要它,您就可以在从 Direct3DWin32 实例获取它时通过函数传递它。引擎设计远不止于此,我个人不建议采用这种方式,但这是另一个时代的故事,也许是一系列书籍。

注意!

您可以像这样定义基本内容,但如果您真的想将多渲染路径设计提升到一个适当的水平,您将不得不引入多态性,添加一个很好的抽象水平。然后你可以简单地定义一个统一的渲染接口(interface)来做正确的事情,无论当前使用的是 DirectX 还是 OpenGL 渲染路径,实例化一个派生类并将其地址赋予指向其抽象基类的指针,该类包含指定的接口(interface)一切符合。然后,您可以不经意地呈现 API 的基础选择。

希望这能解决您当前的问题。同样,再次避免全局变量。快乐的编码。

关于c++ - 访问其他类变量的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11231292/

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