1

场景是,我正在构建一个带有 TextureManager 类的游戏,该类负责加载和管理纹理。实现 IVisibleGameObject 的游戏对象将需要来自 TextureManager 的纹理指针/引用。

纹理管理器是用 a 实现的,std::map<std::string, boost::shared_ptr<Texture> >以在内部保存其对象。

我不确定我应该如何实际暴露纹理,并想到了一些可能性,每种可能性都有自己的缺点:

1)const Texture& GetTex(std::string textureKey)

我觉得这很理想,但我想通过返回 NULL 来表明在地图中未找到纹理。(第二次猜测自己......这合适吗?)

2)shared_ptr<const Texture> GetTex(std::string textureKey)

在这里我可以返回一个空的 shared_ptr,但我对它现在是一个共享对象的暗示感到不舒服。TextureManager 是对象的所有者,毕竟它是管理者。但是,考虑到 IVisibleGameObject 拥有一个指向返回的纹理的引用/指针,并且依赖于它的存在才能正常运行,它是否也是该对象的所有者,也许共享所有权是合适的?

3)const Texture* GetTex(stD::string textureKey)

显然,这是错误的答案。

希望有人为我解决这个问题,也许有一些我没有考虑过的事情。

4

2 回答 2

3

我会坚持使用标准库习语并简单地公开findend. 然后你可以非常高效:

auto it = my_objects.find("foo");

if (it == my_objects.end())
{
    // handle "not found"
}
else
{
    it->second->do_magic();
}

标准库已经有一个完全可用的通用习惯用法,用于处理集合和指示元素的存在或不存在,以及组合插入新或返回现有语义。为什么要重新发明轮子...

于 2012-08-09T23:29:30.573 回答
1

我要做的是让 TextureManager 持有指向每个纹理的单个共享指针,并使 GameObjects 持有弱指针。这样,您可以确保在退出时正确释放了所有内容(保证没有循环)。

于 2012-08-09T23:03:10.520 回答