fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. using namespace std;
  5.  
  6. class Animal
  7. {
  8. public:
  9. using Pointer = unique_ptr<Animal>;
  10.  
  11. public:
  12. struct Point{ Point(double x, double y) : mX{x}, mY{y}{} double mX, mY; };
  13.  
  14. public:
  15. Animal(char id, Point position) : mId{id}, mPosition{position}{}
  16.  
  17. ~Animal()
  18. {
  19. destroy();
  20. }
  21.  
  22. void attackEnemy(const Point* enemyPosition)
  23. {
  24. mEnemyPosition = enemyPosition;
  25. }
  26.  
  27. void destroy()
  28. {
  29. cout << mId << " is destroyed!" << endl;
  30. }
  31.  
  32. const Point* getPosition() const
  33. {
  34. return &mPosition;
  35. }
  36.  
  37. void whatAttack() const
  38. {
  39. cout << mId << " attack: " << (mEnemyPosition ? (to_string(mEnemyPosition->mX) + ' ' + to_string(mEnemyPosition->mY)) : "nothing") << endl;
  40. }
  41.  
  42. private:
  43. char mId;
  44. Point mPosition;
  45. const Point* mEnemyPosition{nullptr};
  46. };
  47.  
  48. int main()
  49. {
  50. Animal::Pointer a{new Animal{'A', {0, 0}}};
  51. Animal::Pointer b{new Animal{'B', {0, 0}}};
  52.  
  53. a->whatAttack();
  54. b->whatAttack();
  55.  
  56. {
  57. Animal::Pointer c{new Animal{'C', {5, 5}}};
  58.  
  59. a->attackEnemy(c->getPosition());
  60. b->attackEnemy(c->getPosition());
  61. a->whatAttack();
  62. b->whatAttack();
  63.  
  64. // C w miedzyczasie ginie z niewiadomych powodów
  65. }
  66.  
  67. a->whatAttack(); // ?
  68. b->whatAttack(); // ?
  69. }
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
A attack: nothing
B attack: nothing
A attack: 5.000000 5.000000
B attack: 5.000000 5.000000
C is destroyed!
A attack: 0.000000 5.000000
B attack: 0.000000 0.000000
B is destroyed!
A is destroyed!