将派生类的对象保存在基 c 的 std::list 中
Saving an object of a derivated class in a std::list of an base c
我正在尝试保存 X 类的对象,该对象是从std::list<Y>
中的基类 Y 派生的。X 类有 Y 类没有的东西,当我保存对象时std::list
,对象切片会发生。还有更多不同的类使用 Y 作为基础,因此为简单起见,仅使用一个存储将是理想的,问题是它们具有不同的成员,因此使用 static_cast
并没有按预期工作。有解决此问题的方法吗?还是我应该放弃它并为每种类型使用不同的容器?
保留Y*
列表。然后,您可以使用完整的虚拟功能分辨率,如果需要,您可以dynamic_cast
(尽管我建议不要这样做)。
后者的原因是,通常有一个原因,为什么你保留一个Y列表而不是其他东西。
切片
之所以发生,是因为您有效地复制了列表中的元素(按值)。使用
std::list<std::unique_ptr<Y>>
或者,如果您需要共享所有权,
std::list<std::shared_ptr<Y>>
相反(最好交换名称 X 和 Y,因为通常 Y 是从 X 派生出来的)。
如果您不需要共享所有权,则应使用 std::unique_ptr
,在这种情况下,请确保将元素std::move
在列表中。 std::unique_ptr
没有std::shared_ptr
(无引用计数)的开销,实际上与原始指针一样快/小。
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::list创建循环链表
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 包含 std::list 的结构体的 C++ 初始化
- 在基于范围的 for 循环期间插入 std::list 的后面
- 循环挂起迭代的 std::擦除 on std::list
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::list 中的迭代器感知对象
- std::list 可以用于简单的无锁队列吗?
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- C++11 基于范围的 for 循环,用于 std::list
- 向 std::list 添加新元素的复杂性
- 如何使用 std::list 模板的迭代器擦除
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 如何将文件的一部分读取到std::list缓冲区?
- 抽象和派生与std::list相结合
- std::list 的两个 insert() 方法签名之间的实现差异
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?