이벤트를 내보내는 이벤트 이미 터와 이벤트를 처리하는 이벤트 핸들러가 있습니다. 나는 확장 할 수있는 Event
다른 같은 행사하기 위해 개체를 AlarmEvent
, 그리고 EventHandler
수 있도록 개체를 AlarmEventHandler
. EventHandler
기능이 HandleEvent(Event &event)
있습니다. 이로 인해 HandleEvent(AlarmEvent &event)
메서드 가있을 수있는 자식 클래스에 문제가 발생 합니다. 분명히 이들은 두 가지 다른 기능이므로 여기에서 재정의가 발생하지 않습니다. 대신 HandleEvent
자식 클래스에 의해 재정의되어야합니다.
나는 문제가 각각 EventHandler
다른 HandleEvent
서명을 가지고 있으므로 EventEmitter
항상 기본 이벤트를 처리 한다는 것을 완전히 이해합니다 EventHandler::HandleEvent
. Event &event
매개 변수로 사용 EventEmitter::Emit
하면 어떤 종류의 Event
문제를 다루고 있는지 알고 올바른 방법을 선택할 수 있다고 생각했습니다 .
기본 메서드 대신 어떻게 EventEmitter
호출 할 수 있습니까?AlarmEventHandler::HandleEvent
EventHandler::HandleEvent
// Example program
#include <iostream>
#include <string>
#include <vector>
// event types
class Event {};
class AlarmEvent : public Event {};
// event handler
class EventHandler {
public:
virtual void HandleEvent(Event event);
};
void EventHandler::HandleEvent(Event event){
std::cout << "Handle event " << std::endl;
}
// alarm event handler
class AlarmEventHandler : public EventHandler {
public:
void HandleEvent(AlarmEvent event);
};
void AlarmEventHandler::HandleEvent(AlarmEvent event){
std::cout << "Handle alarm event " << std::endl;
}
// event emitter
class Emitter {
public:
std::vector<EventHandler*> handlers;
void Emit(Event &event);
};
void Emitter::Emit(Event &event){
for(size_t i = 0; i < this->handlers.size(); i++){
this->handlers[i]->HandleEvent(event);
}
}
int main()
{
AlarmEventHandler handler;
AlarmEvent event;
Emitter emitter;
emitter.handlers.push_back(&handler);
// problem:
// Handle event printed instead of Handle alarm event
emitter.Emit(event);
}
를 사용 dynamic_cast
!
따라서 AlarmEventHandler
다음과 같이 보일 수 있습니다.
// alarm event handler
class AlarmEventHandler : public EventHandler {
public:
void HandleEvent(const Event &event); // Our polymorphic override
void HandleEvent(AlarmEvent event); // Our custom Alarm logic
};
void AlarmEventHandler::HandleEvent(const Event &event){
try {
HandleEvent(dynamic_cast<const AlarmEvent&>(event));
} catch(const std::exception& e) {
std::cerr << "I can't handle things that aren't AlarmEvents!" << std::endl;
}
}
void AlarmEventHandler::HandleEvent(const AlarmEvent &event){
std::cout << "Handle alarm event " << std::endl;
}
하지만 이렇게하려면 Event
다형성 클래스가되어야합니다. 따라서 소멸자를 만듭니다 virtual
.
class Event {
public: virtual ~Event() {} //Need this so Event is a polymorphic class
};
여기에서 실행을 참조하십시오 : https://ideone.com/KMkLfq
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다