如何正确使用 std::shared_ptr 和 std::map

0zelot12

我正在尝试在 2D 网格上实现某种模拟游戏。

我有 8 种不同的图块基本图形,并希望在地图中保存指向图像数据的指针,以便我稍后可以通过定义为 enum(用于地图)。

我有一个image类,它保存图像的标题和存储在std::vector<char>. 图像类加载这些图像并将 a 返回std::vector<std::shared_pointer<image>>到我的 GUI 类。由于我使用 Qt,我想存储共享指针以便QPixmap稍后在我的地图上绘制它。

我的地图看起来像:

std::map<TERRAIN_TYPE, std::shared_ptr<QPixmap>> m_terrain_type_to_pixmap;

我像这样生成我的 QPixmap:

std::shared_ptr<QPixmap> pixmap_deep_water = std::make_shared<QPixmap>(m_tga_terrain_images[0]->pixel_data().data()); // pixel_data() gets the vector of bytes

我将它插入到地图中,如下所示:

m_terrain_type_to_pixmap.insert(std::pair<TERRAIN_TYPE, std::shared_ptr<QPixmap>>(TERRAIN_TYPE::DEEP_WATER, pixmap_deep_water));

我正在以这种方式访问​​元素:

auto test = m_terrain_type_to_pixmap.find(m_presenter.model.m_world.m_map[0].m_terrain_type)->second;

这是我的问题:

从我的地图中检索一个元素后,指针不指向任何数据(根据调试器,屏幕上只填充了白色瓷砖)。在我检索指针之前,调试器中的一切似乎都很好,但是检索到的地图元素似乎“丢失”了它们的数据。

约翰·帕克

QPixmap 没有带有指向(无符号)字符的指针的构造函数。

std::shared_ptr<QPixmap> pixmap_deep_water = std::make_shared<QPixmap>(m_tga_terrain_images[0]->pixel_data().data()); // pixel_data() gets the vector of bytes

您应该声明 QPixmap 并调用loadFromData().

QPixmap pixmap;  // or std::shared_ptr<QPixmap>
std::vector<unsigned char>& imgdata=m_tga_terrain_images[0]->pixel_data();
pixmap.loadFromData(imgdata.data(), imgdata.size());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用std map和shared_ptr的奇怪内存行为

使用std :: move与std :: shared_ptr

如何取得std :: unique_ptr和std :: shared_ptr的所有权

使用std :: weak_ptr和std :: shared_ptr进行阴影

std :: shared_ptr和继承

将std :: map :: emplace与返回shared_ptr的函数一起使用是否正确?

使用braced-init初始化std :: shared_ptr <std :: map <>>

使用XCode / Clang用std :: shared_ptr实例化std :: map时出错

使用std :: shared_ptr和std :: thread的编译器错误

std :: shared_ptr如何释放?

如何访问std :: shared_ptr的内容?

如何访问 std::shared_ptr 方法

使用shared_ptr启动std :: thread

使用* this作为std :: shared_ptr

std :: enable_if和std :: shared_ptr

如何使用std :: shared_ptr <void>和另一种类型的std :: shared_ptr进行函数重载?

SWIG:将std :: map访问器与shared_ptr一起使用?

使用模板将std :: shared_ptr <Derived>上载到std :: shared_ptr <Base>

使用相同的函数但具有不同的重载来转换std :: tr1 :: shared_ptr <T>和std :: shared_ptr <T>

在lambda中使用std :: shared_ptr移动std ::

std :: unordered_map插入错误shared_ptr C ++

与std :: shared_ptr和std :: unique_ptr相比,std :: optional`有什么优势?

std :: shared_ptr和std :: experimental :: atomic_shared_ptr有什么区别?

通过 std::shared_ptr 使用 Rcpp 和 RcppParallel 的线程安全函数指针

使用 std::vector 和 shared_ptr 优化 C++ 代码

如何在boost :: object_pool中使用boost :: shared_ptr / std :: shared_ptr?

继承和智能指针(std :: shared_ptr)

CComPtr和std :: shared_ptr互操作性

std :: shared_ptr :: unique(),复制和线程安全