Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. /******************************************************************************
  2.  
  3.                               Online C++ Compiler.
  4.                Code, Compile, Run and Debug C++ program online.
  5. Write your code in this editor and press "Run" button to compile and execute it.
  6.  
  7. *******************************************************************************/
  8.  
  9. #include <iostream>
  10. #include <vector>
  11. #include <memory>
  12.  
  13. enum class Side
  14. {
  15.     China,
  16.     America,
  17.     GLA
  18. };
  19.  
  20. class Warrior
  21. {
  22. public:
  23.     virtual void attack() = 0;
  24. };
  25.  
  26. class Worker
  27. {
  28. public:
  29.     virtual void work() = 0;  
  30. };
  31.  
  32. class ChineeseWorker : public Worker
  33. {
  34. public:
  35.     void work() override { std::cout << "For the mother China!" << std::endl;  }
  36. };
  37.  
  38. class AmericanWorker : public Worker
  39. {
  40. public:
  41.     void work() override { std::cout << "When you will pay me?" << std::endl;  }
  42. };
  43.  
  44. class GLAWorker : public Worker
  45. {
  46. public:
  47.     void work() override { std::cout << "I need shoes..." << std::endl;  }
  48. };
  49.  
  50. class ChineeseWarrior : public Warrior
  51. {
  52. public:
  53.     void attack() override { std::cout << "Han dzi dzio!!!" << std::endl; }    
  54. };
  55.  
  56. class AmericanWarrior : public Warrior
  57. {
  58. public:
  59.     void attack() override { std::cout << "Arrgggghhh!!!" << std::endl; }    
  60. };
  61.  
  62. class GLAWarrior : public Warrior
  63. {
  64.     void attack() override { std::cout << "To the victory!" << std::endl; }  
  65. };
  66.  
  67. class Factory
  68. {
  69. public:
  70.     virtual std::unique_ptr<Warrior> createWarrior() const = 0;
  71.     virtual std::unique_ptr<Worker> createWorker() const = 0;
  72. };
  73.  
  74. class GLAFactory : public Factory
  75. {
  76. public:
  77.     std::unique_ptr<Warrior> createWarrior() const override
  78.     {
  79.         return std::make_unique<GLAWarrior>();
  80.     }
  81.     std::unique_ptr<Worker> createWorker() const override
  82.     {
  83.         return std::make_unique<GLAWorker>();
  84.     }
  85. };
  86.  
  87. class AmericanFactory : public Factory
  88. {
  89. public:
  90.     std::unique_ptr<Warrior> createWarrior() const override
  91.     {
  92.         return std::make_unique<AmericanWarrior>();
  93.     }
  94.     std::unique_ptr<Worker> createWorker() const override
  95.     {
  96.         return std::make_unique<AmericanWorker>();
  97.     }
  98. };
  99.  
  100. class ChineeseFactory : public Factory
  101. {
  102. public:
  103.     std::unique_ptr<Warrior> createWarrior() const override
  104.     {
  105.         return std::make_unique<ChineeseWarrior>();
  106.     }
  107.     std::unique_ptr<Worker> createWorker() const override
  108.     {
  109.         return std::make_unique<ChineeseWorker>();
  110.     }
  111. };
  112.  
  113. class Player
  114. {
  115. public:
  116.     Player(Factory& factory) : m_factory {factory} {}
  117.     void setupArmy() {
  118.         m_army.reserve(defaultArmyCount);
  119.         for (size_t i = 0; i < defaultArmyCount; ++i) {
  120.            m_army.push_back(m_factory.createWarrior());
  121.         }
  122.         for (size_t i = 0; i < defaultWorkersCount; ++i) {
  123.            m_workers.push_back(m_factory.createWorker());
  124.         }
  125.     }
  126.     void startAttack() {
  127.         for (const auto& warrior : m_army)
  128.         {
  129.             warrior->attack();
  130.         }
  131.     }
  132.     void startWork() {
  133.         for (const auto& worker : m_workers)
  134.         {
  135.             worker->work();
  136.         }
  137.     }
  138.     static const size_t defaultArmyCount {3};
  139.     static const size_t defaultWorkersCount {5};
  140. private:
  141.     std::vector<std::unique_ptr<Warrior>> m_army;
  142.     std::vector<std::unique_ptr<Worker>> m_workers;
  143.     const Factory& m_factory;
  144. };
  145.  
  146. class Game
  147. {
  148. public:
  149.     Player player1;
  150.     Player player2;
  151. };
  152.  
  153. int main()
  154. {
  155.     static GLAFactory glaFactory {};
  156.     static AmericanFactory americanFactory {};
  157.     Game game {Player {glaFactory}, Player {americanFactory}};
  158.    
  159.     game.player1.setupArmy();
  160.     game.player1.startWork();
  161.    
  162.     game.player2.setupArmy();
  163.     game.player2.startWork();
  164.     return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement