需要帮助以避免向下转发

时间:2011-03-01 08:53:36

标签: c++ inheritance casting polymorphism

我创建了一个由以下类

简化描述的事件处理程序系统
IEventType - containing string name and hashed int value of the name for fast search
IEventData - data send along with a triggered event
EventManager - containing a std::map of <int, boost::signals2< bool( boost::shared_ptr< IEventData > ) >

(还有一些其他的听众对于lua脚本的边缘事件和更多,但我认为现在无关紧要了)

实际问题是: 当我派生出一个IEventData时,让我们说:

class EData_WriteToConsole : IEventData
{
  std::string text;
  int layer;
  ...
}

然后我将一些成员函数注册到信号:

OnWriteToConsole( boost::shared_ptr< IEventData > ){ ... }
m_EventManager->AddListener(boost::bind(&Console::OnWriteToConsole, m_Console, _1));

然后使用EventManager的TriggerEvent函数

boost::shared_ptr< EData_WriteToConsole > eventData(new EData_WriteToConsole("Text..", 1));
m_EventManager->TriggerEvent(eventData);

最后我的事件被触发: 但我无法访问EData_WriteToConsole特定的事件数据,因为OnWriteToConsole只接收基类IEventData ptr。

所以我需要将boost :: shared_ptr指向的IEventData转发到派生类EData_WriteToConsole。

我现在被卡住了,因为我的大脑在最后几天没有得到足够的睡眠,我只是想不出没有向下转换的解决方案。 有没有解决方法,我可以以某种方式重构我的类层次结构,所以我不需要upcast吗?(我想创建一个std :: map,其数据作为eventdata传递,所以接收功能可以搜索它需要的东西,但对我来说似乎缓慢而愚蠢)请帮助

1 个答案:

答案 0 :(得分:2)

你能在IEventData接口中放一个虚方法,例如在派生类中实现的actionEvent()可以调用操作事件所需的任何内容吗?

如果事件需要以几种不同的方式采取行动,它会限制你一点。