fork download
  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <exception>
  6.  
  7. // event types
  8. class Event {
  9. public: virtual ~Event() {} //Need this so Event is a polymorphic class
  10. };
  11. class AlarmEvent : public Event {};
  12. class ScoheEvent : public Event {};
  13.  
  14. // event handler
  15. class EventHandler {
  16. public:
  17. virtual void HandleEvent(const Event &event);
  18. };
  19. void EventHandler::HandleEvent(const Event &event){
  20. std::cout << "Handle event " << std::endl;
  21. }
  22.  
  23. // alarm event handler
  24. class AlarmEventHandler : public EventHandler {
  25. public:
  26. void HandleEvent(const Event &event);
  27. void HandleEvent(const AlarmEvent &event);
  28. };
  29.  
  30. void AlarmEventHandler::HandleEvent(const Event &event){
  31. try {
  32. HandleEvent(dynamic_cast<const AlarmEvent&>(event));
  33. } catch(const std::exception& e) {
  34. std::cout << "I can't handle things that aren't AlarmEvents!" << std::endl;
  35. }
  36. }
  37.  
  38. void AlarmEventHandler::HandleEvent(const AlarmEvent &event){
  39. std::cout << "Handle alarm event " << std::endl;
  40. }
  41.  
  42. // event emitter
  43. class Emitter {
  44. public:
  45. std::vector<EventHandler*> handlers;
  46. void Emit(Event &event);
  47. };
  48. void Emitter::Emit(Event &event){
  49. for(size_t i = 0; i < this->handlers.size(); i++){
  50. this->handlers[i]->HandleEvent(event);
  51. }
  52. }
  53.  
  54. int main()
  55. {
  56. AlarmEventHandler handler;
  57. AlarmEvent event;
  58. Emitter emitter;
  59. emitter.handlers.push_back(&handler);
  60. emitter.Emit(event);
  61.  
  62. ScoheEvent scohe;
  63. emitter.Emit(scohe);
  64. }
Success #stdin #stdout 0s 4552KB
stdin
Standard input is empty
stdout
Handle alarm event 
I can't handle things that aren't AlarmEvents!