公开对象管理器对象的可接受方式?

时间:2012-08-09 22:58:24

标签: c++ oop boost smart-pointers

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

纹理管理器使用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)

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

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

显然,这是错误的答案。

希望有人为我清除这一点,也许有些事情我没有考虑过。

2 个答案:

答案 0 :(得分:3)

我会坚持使用标准库惯用法,只需公开findend。那么你可以非常高效:

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

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

标准库已经具有完全可维护的通用习惯用法,用于处理集合和信令元素的存在或缺失,以及组合insert-new-or-return-existing语义。为什么重新发明轮子......

答案 1 :(得分:1)

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