我创建了一个由以下类
简化描述的事件处理程序系统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传递,所以接收功能可以搜索它需要的东西,但对我来说似乎缓慢而愚蠢)请帮助
答案 0 :(得分:2)
你能在IEventData接口中放一个虚方法,例如在派生类中实现的actionEvent()可以调用操作事件所需的任何内容吗?
如果事件需要以几种不同的方式采取行动,它会限制你一点。