【问题标题】:Loading game data into pool without globals在没有全局变量的情况下将游戏数据加载到池中
【发布时间】:2015-03-30 09:35:19
【问题描述】:

我正在编写一个可通过 TELNET 获得的基于文本的游戏,用于我自己在 C++ 中的娱乐。我根据游戏方面/组件(例如车辆、行人、玩家、车辆、自行车等)创建了一个类层次结构。

我正在考虑实现一个“池”对象,该对象将存储指向特定加载元素的指针。我正在考虑在池中使用 Add() 函数,该函数会根据我想添加到池中的元素的类而重载。问题如下:假设我想让这个元素池(或它上面的某个层)一直可用。也许我需要一个函数 GetAllVehicles()(只是一个简单的例子),它会查看池数据并返回带有一堆指针的数组中的所有车辆。

问题是,如果我想在我的代码中的某个地方通过这个池怎么办。从本质上讲,Pool 对象在某种意义上应该是一个全局,因为你想在任何地方访问你加载的游戏元素,而不必永远传递创建的对象。但是,我不希望它污染全局命名空间,并且我想要多线程,所以声明一个全局变量将是一个特别糟糕的主意。

问题很简单:我应该怎么做才能完成这项工作?

【问题讨论】:

  • 池(以及池中的对象)是否将是不可变的?如果是这样(或者如果你可以这样做,例如通过在启动时设置它们并承诺以后永远不会修改它们),那么来自多个线程的只读访问将不会成为问题。至于污染全局命名空间,你可以随时在单独的命名空间中声明它们。
  • thread_local 怎么样?

标签: c++ multithreading globals


【解决方案1】:

一种方法是在您的main 函数中创建一个实例,并将该实例传递给使用它的每个函数或传递给需要池的对象的构造函数。

另一种可能性是单例设计模式。

问题的双方都有燃烧的龙(单例与传递对象)。选择你自己的毒药。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多