0

std::map<int, std::shared_ptr<base>>在控制器类中有一个 m_items。

控制器将项目提供给外部消费者,他们只需要基础,因此多态性非常适合。然而,当某些事件发生时,控制器内部需要更新或删除特定类型的项目。更新本质上是非常不同的,并且每个事件都需要不同的数据集,所以我不能只在基类中有一个通用的“更新”方法。我需要的是一种仅在事件发生时迭代某些派生类型(然后我需要将其转换为派生类型指针)的方法。一种解决方案是EDerivedType GetType()在基类中添加 a ,每个派生类型返回一个不同的枚举值,因此当我迭代时,我可以与所需的类型进行比较。虽然这可行,但它不是一种面向对象的方法。

谁能建议一种更优雅的方式来做到这一点?

谢谢...

4

2 回答 2

1

我认为访客设计模式可以为您工作。您的基类将有一个抽象accept,它将访问者作为参数。

每个对象都会有一个accept调用正确的访问者函数来进行更新的对象。

于 2013-08-18T10:46:28.917 回答
0

我想你已经抓住了这个想法:“我需要的是一种仅在事件发生时迭代某些派生类型(然后我需要将其强制转换为派生类型指针)的方法。”

您可以保留一个std::map< EDerivedType, Controlloer *>并直接找到相应的Controller。此外,Controller 应该是一个多态基类。

于 2013-08-18T12:39:29.640 回答