仅在一个具有基指针的std::map派生类型上进行迭代
Iteration over one derived type only of std::map with base pointers
我在控制器类中有一个std::map<int, std::shared_ptr<base>>
m_items。
控制器将项目提供给外部消费者,他们只需要基本功能,因此多态性非常适用。然而,当某些事件发生时,控制器内部需要更新或删除特定类型的项目。更新的性质非常不同,每个事件需要不同的数据集,所以我不能在基类中只有一个通用的"更新"方法。当事件发生时,我需要的是一种只在某些派生类型上迭代的方法(然后我需要将其转换为派生类型指针)。一种解决方案是在基中添加一个EDerivedType GetType()
,每个派生类型都返回一个不同的枚举值,这样当我迭代时,我就可以与所需的类型进行比较。虽然这是有效的,但它不是OO方法。
有人能建议一种更优雅的方法吗?
谢谢。。。
我认为Visitor设计模式可以为您工作。基类将有一个抽象的accept
,它将访问者作为参数。
每个对象都将有一个accept
,它将调用正确的访问者函数来进行更新。
我想你已经明白了这个想法:"我需要的是一种方法,当事件发生时,只在某些派生类型上迭代(然后我需要将其转换为派生类型指针)。"
您可以保留一个std::map< EDerivedType, Controlloer *>
并直接找到相应的控制器。此外,Controller应该是一个多态性基类。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- 从std::map派生的类不在Visual C++上编译(但在gcc和clang上编译)
- 在 std::map 中存储指向派生类实例的指针
- 哪个性能更快?具有 N 个派生类型的 vtable 查找,或具有 N 个元素的 std::map 查找
- 仅在一个具有基指针的std::map派生类型上进行迭代