gpt4 book ai didi

c++ - 管理模块类的最佳选择

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:48 26 4
gpt4 key购买 nike

我的游戏库由一系列模块组成,按类组织,在需要时创建、更新和交互。

一些示例可能是:CWindowManagerCGraphicsManagerCPhysicsManager 等。

我很惭愧不得不说我目前为它们使用全局指针(extern CWindowManager* g_WindowManager;),而且我知道这可能是一件坏事。

无论如何,问题是这些模块需要动态地创建和删除,当然要以正确的顺序进行。还有一个问题就是像CPhysicsManager这样的模块是场景依赖的,所以在切换场景的时候会被删除,然后重新创建。

现在,我想不再使用全局变量来处理我的游戏中的模块。

我不害怕重构,但我真的想不出什么是全局变量的最佳替代品。

我考虑过创建一个 CModuleManager 类并将模块的实例作为成员存储在其中,然后从 CModule 基类派生。虽然我真的想不出这将如何详细工作。

这似乎是软件开发尤其是游戏开发中的常见问题,所以:

- 与简单地使用全局指针相比,管理模块的最佳选择是什么?

最佳答案

使用全局数据时需要考虑的一些事项:

  • 多线程。如果不同线程可以同时访问全局数据,则需要小心。
  • 可测试性。如果您正在编写单元测试,则需要在任何代码访问全局数据之前初始化全局数据。

使用全局数据的替代方法是将每个类/方法所需的对象实例作为参数传递。这样做的好处是类的所有依赖项都可以从 API 中看到。它还使编写单元测试变得更加容易。缺点是如果到处传递对象,代码会变得困惑。

您拥有 ModuleManager 的想法听起来像是服务定位器模式 - 我认为这是一个可行的解决方案。此链接可能有帮助:http://gameprogrammingpatterns.com/service-locator.html .

如果选择继续使用全局指针,那么动态删除全局数据可以在C++中使用智能指针(auto_ptr)实现。

关于c++ - 管理模块类的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882766/

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