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

标签 c++ oop boost smart-pointers

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

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

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

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

我觉得会很理想,但我想通过返回 NULL 来指示在 map 中找不到纹理。 (第二次猜测自己......这合适吗?)

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

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

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

显然,这是错误的答案。

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

最佳答案

我会坚持使用标准库的习惯用法,只公开findend。然后你就可以非常高效了:

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

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

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

关于c++ - 公开对象管理器对象的可接受方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11893209/

相关文章:

java - Android项目中私有(private)变量使用getter和setter时

java - 如何在初始化复杂java对象时初始化它的所有子非原始字段?

c++ - (关于 C++ OOPS 的作业帮助)动态绑定(bind)和覆盖

c++ - OpenCV 错误 : Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat

c++ - C++ 中的碰撞检测方法

C++ 旋转线变短

c++ - 创建 boost::file_mapping 对象的成本?

c++ - 想要在使用 boost 程序选项时允许多次指定选项。现在我多次出现

boost - 如何强制Boost使用rpath?

c++ - boost::multi_index_container,对容器内 std::set 的操作