gpt4 book ai didi

C++, boost : How to store objects of an abstract type in a map container

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:44 25 4
gpt4 key购买 nike

我正在尝试使用 map 容器来保存形状并将这些形状与 ID 号相匹配。

直到现在,我一直使用 STL 容器来保存和内存管理我的对象。所以我会使用这些类型的容器:

std::map<int, Square> squares;
std::map<int, Triangle> triangles;
std::map<int, Circle> circles;

但我想要一个单一的 map 来保存“Shapes”,这是 Square、Triangle 和 Circle 的抽象基类。所以为了实现这一点,我仍然会把可实现的派生类对象存储在它们自己的映射中,然后再有一个映射:

std::map<int, Shape*> shapes;

存储指向存储在其他 map 中的对象的指针。

虽然这看起来很困惑,但我宁愿将所有对象存储在一个多态映射中,该映射拥有并内存管理所包含的对象。

在阅读了一些有关 Boost 的 ptr_map 的信息后,我预计这就是解决方案。但似乎基类需要在尝试使用时实现:

boost::ptr_map<int,Shape> shapes;

我收到错误:“错误:无法分配抽象类型‘Shape’的对象”

我必须使基类可实现吗?这会有点 hack,所以如果有这样的方法,我宁愿正确地做到这一点。

关于如何做到这一点,我的下一个最佳猜测是使用容器,例如:

std::map<int, boost::shared_ptr<Shape> > shapes;

这似乎是一个非常简单的目标,但由于我遇到了如此困难,我怀疑我正在尝试做一些我不应该做的事情。因此,非常感谢任何关于我可能哪里出错的建议。

谢谢。

最佳答案

ptr_map<int, Shape>似乎是要走的路,甚至可以使用抽象基类型(参见示例 here )。我想您获得的错误来自使用 operator[] .确实,就像在 std::map 中一样, operator[]如果键不在映射中,则返回默认构造的值。在这种情况下,它无法构造自 Shape 以来的值。是抽象的,因此编译器错误。

所以你可以使用ptr_map但不是索引运算符。插入时使用insert , 查找 key 时,使用 find .

关于C++, boost : How to store objects of an abstract type in a map container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com