fork download
  1. #include<iostream>
  2. #include<vector>
  3.  
  4. struct IObject
  5. {
  6. virtual ~IObject(){}
  7. virtual IObject* Clone()=0;
  8. virtual void Work()=0;
  9. };
  10.  
  11. struct Concrete_Object1: IObject
  12. {
  13. virtual ~Concrete_Object1(){ std::cout<<"Concrete_Object1: destroyed\n"; }
  14. virtual Concrete_Object1* Clone() { return new Concrete_Object1(*this); }
  15. virtual void Work(){ std::cout<<"Concrete_Object1: working\n"; }
  16. };
  17. struct Concrete_Object2: IObject
  18. {
  19. virtual ~Concrete_Object2(){ std::cout<<"Concrete_Object2: destroyed\n"; }
  20. virtual Concrete_Object2* Clone() { return new Concrete_Object2(*this); }
  21. virtual void Work(){ std::cout<<"Concrete_Object2: working\n"; }
  22. };
  23.  
  24.  
  25. struct Manager
  26. {
  27. ~Manager()
  28. {
  29. const size_t size = mObj.size();
  30. for(size_t n=0;n<size;++n){ delete mObj[n]; mObj[n] = 0l; }
  31. }
  32.  
  33. void Connect(IObject* src){ mObj.push_back( src->Clone() ); }
  34.  
  35. void Work()
  36. {
  37. const size_t size = mObj.size();
  38. for(size_t n=0;n<size;++n){ mObj[n]->Work(); }
  39. }
  40. std::vector<IObject*> mObj;
  41. };
  42.  
  43.  
  44. int main()
  45. {
  46. Manager man;
  47. IObject* agent1 = new Concrete_Object1();
  48. IObject* agent2 = new Concrete_Object2();
  49.  
  50. man.Connect(agent1);
  51. man.Connect(agent2);
  52.  
  53. delete agent1;
  54. delete agent2;
  55.  
  56. man.Work();
  57.  
  58. return 0;
  59. }
Success #stdin #stdout 0.02s 2816KB
stdin
Standard input is empty
stdout
Concrete_Object1: destroyed
Concrete_Object2: destroyed
Concrete_Object1: working
Concrete_Object2: working
Concrete_Object1: destroyed
Concrete_Object2: destroyed