fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <string>
  4.  
  5. class Person;
  6.  
  7. enum class ECharTypes
  8. {
  9. GOOD,
  10. ZOMBIE
  11. };
  12.  
  13. class Character
  14. {
  15. public:
  16. Character() : a(420){}
  17. virtual ~Character() = 0;
  18.  
  19. virtual void Talk() const = 0;
  20.  
  21. friend Person;
  22.  
  23. protected:
  24. Person* AttachedPerson;
  25. int a;
  26. };
  27.  
  28. Character::~Character()
  29. {}
  30.  
  31. class LOIPON_ZOMBIE final : public Character
  32. {
  33. public:
  34. LOIPON_ZOMBIE() : Character(), b(5){}
  35. ~LOIPON_ZOMBIE() override = default;
  36.  
  37. void Talk() const override
  38. {
  39. std::cout << "BLRHLRBRGBLBL!" << std::endl;
  40. }
  41.  
  42. friend Person;
  43.  
  44. private:
  45. int b;
  46. };
  47.  
  48. class Good final : public Character
  49. {
  50. public:
  51. Good() : Character(), aaa("blaze it fagit"){}
  52. ~Good() override = default;
  53.  
  54. void Talk() const override
  55. {
  56. std::cout << "Smoke weed everyday!" << std::endl;
  57. }
  58.  
  59. friend Person;
  60.  
  61. private:
  62. std::string aaa;
  63. };
  64.  
  65. class Person final
  66. {
  67. private:
  68. std::unique_ptr<Character> AttachedCharacter;
  69.  
  70. public:
  71. Person() = delete;
  72. Person(ECharTypes CharType)
  73. {
  74. switch (CharType)
  75. {
  76. case ECharTypes::GOOD:
  77. std::cout << "I'm Good and ready for some ass-whooping!" << std::endl;
  78. AttachedCharacter = std::make_unique<Good>();
  79. break;
  80.  
  81. case ECharTypes::ZOMBIE:
  82. std::cout << "BRRRAINZZ!" << std::endl;
  83. AttachedCharacter = std::make_unique<LOIPON_ZOMBIE>();
  84. break;
  85.  
  86. default:
  87. std::cerr << "Pali thn ekanes" << std::endl;
  88. exit(1);
  89. break;
  90. }
  91.  
  92. AttachedCharacter->AttachedPerson = this;
  93. }
  94.  
  95. ~Person() = default;
  96.  
  97. void Talk() const
  98. {
  99. AttachedCharacter->Talk();
  100. }
  101.  
  102. void Convert(ECharTypes ConvertType)
  103. {
  104. switch (ConvertType)
  105. {
  106. case ECharTypes::GOOD:
  107. {
  108. auto Temp = std::make_unique<Good>();
  109. AttachedCharacter.reset(Temp.release());
  110. std::cout << "Converted to Good!" << std::endl;
  111. break;
  112. }
  113.  
  114. case ECharTypes::ZOMBIE:
  115. {
  116. auto Temp = std::make_unique<LOIPON_ZOMBIE>();
  117. AttachedCharacter.reset(Temp.release());
  118. std::cout << "Converted to Zombie!" << std::endl;
  119. break;
  120. }
  121.  
  122. default:
  123. std::cerr << "Pali edw eisai?" << std::endl;
  124. exit(2);
  125. break;
  126. }
  127.  
  128. AttachedCharacter->AttachedPerson = this;
  129. }
  130. };
  131.  
  132. int main() {
  133. Person P(ECharTypes::GOOD);
  134. P.Talk();
  135.  
  136. P.Convert(ECharTypes::ZOMBIE);
  137. P.Talk();
  138.  
  139. return 0;
  140. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
I'm Good and ready for some ass-whooping!
Smoke weed everyday!
Converted to Zombie!
BLRHLRBRGBLBL!