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

标签 c++ boost polymorphism containers smart-pointers

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

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

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

但我想要一个单一的 map 来保存“形状”,这是正方形、三角形和圆形的抽象基类。因此,为了实现这一目标,我仍然会将可实现的派生类对象存储在它们自己的映射中,然后再有另一个映射:

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

存储指向其他映射中存储的对象的指针。

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

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

boost::ptr_map<int,Shape> shapes;

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

我必须使基类可实现吗?这有点麻烦,所以如果有这样的方法,我宁愿正确地执行此操作。

我对如何执行此操作的下一个最佳猜测是使用容器,例如:

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

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

谢谢。

最佳答案

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

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

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

相关文章:

c++ - 如何为 OpenMP 中的任意数量的线程并行化获得相同的输出以用于 if-else,增量?

c++ - 在g++ <7.4.0>上boost::archive::text_iarchive in_archive {is} boost <1.71>崩溃

c++ - 多态调用的成本 - C++

c# - 使用派生泛型派生类的实例调用方法

java - java中是否存在关于友元函数的任何内容?

c++ - 为什么我的程序有时只能正确识别数组中的最高值和最低值?

c++ - alignas 用于内联静态成员时是否合法?

c++ - 使用 gzip_compressor 产生不同的文件大小

c++ - 在Boost Graph Library中选择给定顶点的随机进出邻居的有效方法?

java - 不完全确定为什么要使用多态引用