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. Concrete_Object1(){ std::cout<<"Concrete_Object1: was build\n"; }
  14. Concrete_Object1(const Concrete_Object1& rhs) { std::cout<<"Concrete_Object1: was build by copy\n"; }
  15. virtual void Work() { std::cout<<"Concrete_Object1: working\n"; }
  16. virtual ~Concrete_Object1() { std::cout<<"Concrete_Object1: destroyed\n"; }
  17. virtual Concrete_Object1* Clone() { return new Concrete_Object1(*this); }
  18. };
  19. struct Concrete_Object2: IObject
  20. {
  21. Concrete_Object2(){ std::cout<<"Concrete_Object2: was build\n"; }
  22. Concrete_Object2(const Concrete_Object2& rhs) { std::cout<<"Concrete_Object2: was build by copy\n"; }
  23. virtual void Work() { std::cout<<"Concrete_Object2: working\n"; }
  24. virtual ~Concrete_Object2() { std::cout<<"Concrete_Object2: destroyed\n"; }
  25. virtual Concrete_Object2* Clone() { return new Concrete_Object2(*this); }
  26. };
  27.  
  28. struct Manager
  29. {
  30. ~Manager()
  31. {
  32. const size_t size = mObj.size();
  33. for(size_t n=0;n<size;++n){ delete mObj[n]; mObj[n] = 0l; }
  34. }
  35.  
  36. void Connect(IObject* src){ mObj.push_back( src->Clone() ); }
  37.  
  38. void Work()
  39. {
  40. const size_t size = mObj.size();
  41. for(size_t n=0;n<size;++n){ mObj[n]->Work(); }
  42. }
  43. std::vector<IObject*> mObj;
  44. };
  45.  
  46.  
  47. int main()
  48. {
  49. Manager man;
  50. IObject* agent1 = new Concrete_Object1();
  51. IObject* agent2 = new Concrete_Object2();
  52.  
  53. man.Connect(agent1);
  54. man.Connect(agent2);
  55.  
  56. delete agent1;
  57. delete agent2;
  58.  
  59. man.Work();
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0.02s 2860KB
stdin
Standard input is empty
stdout
Concrete_Object1: was build
Concrete_Object2: was build
Concrete_Object1: was build by copy
Concrete_Object2: was build by copy
Concrete_Object1: destroyed
Concrete_Object2: destroyed
Concrete_Object1: working
Concrete_Object2: working
Concrete_Object1: destroyed
Concrete_Object2: destroyed