fork download
  1. #include <iostream>
  2. #include <set>
  3. using namespace std;
  4.  
  5. struct EventHandle {};
  6.  
  7. class Subject;
  8. class Observer {
  9. public:
  10. virtual void OnEvent(const EventHandle& h, Subject& affectedItem) = 0;
  11. virtual ~Observer() {} // virtual function ? => better foresee a virtual destructor
  12. };
  13.  
  14. class Subject {
  15. public:
  16. void AddObserver(Observer* o) {
  17. observers.insert(o);
  18. }
  19. void RemoveObserver(Observer* o) {
  20. //observers.remove(o);
  21. }
  22. void Notify(const EventHandle& h, Subject& affectedItem) {
  23. for (Observer* o : observers) {
  24. o->OnEvent(h, affectedItem);
  25. }
  26. }
  27. private:
  28. set<Observer*> observers;
  29. };
  30.  
  31. struct ConcreteObserverA : Observer {
  32. void OnEvent(const EventHandle& h, Subject& affectedItem) override {
  33. cout<<"A:"<<&affectedItem<<endl;
  34. }
  35.  
  36. };
  37. struct ConcreteObserverB : Observer {
  38. void OnEvent(const EventHandle& h, Subject& affectedItem) override {
  39. cout<<"B:"<<&affectedItem<<endl;
  40. }
  41. };
  42.  
  43. struct ConcreteSubjectSA : Subject { };
  44. struct ConcreteSubjectSB : Subject { };
  45.  
  46.  
  47. int main() {
  48. ConcreteSubjectSA sa1;
  49. ConcreteSubjectSB sb1;
  50. ConcreteObserverA a1;
  51. ConcreteObserverB b1;
  52. sa1.AddObserver(&a1);
  53. sa1.AddObserver(&b1);
  54. sb1.AddObserver(&b1);
  55. sa1.Notify (EventHandle{}, sa1);
  56. sb1.Notify (EventHandle{}, sb1);
  57.  
  58.  
  59.  
  60. // your code goes here
  61. return 0;
  62. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
A:0xbfc64b80
B:0xbfc64b80
B:0xbfc64b98