#include <iostream>
#include <memory>
using namespace std;
class Animal
{
public :
using Pointer = unique_ptr< Animal> ;
public :
struct Point{ Point( double x, double y) : mX{ x} , mY{ y} { } double mX, mY; } ;
public :
Animal( char id, Point position) : mId{ id} , mPosition{ position} { }
~Animal( )
{
destroy( ) ;
}
void attackEnemy( const Point* enemyPosition)
{
mEnemyPosition = enemyPosition;
}
void destroy( )
{
cout << mId << " is destroyed!" << endl;
}
const Point* getPosition( ) const
{
return & mPosition;
}
void whatAttack( ) const
{
cout << mId << " attack: " << ( mEnemyPosition ? ( to_string( mEnemyPosition- > mX) + ' ' + to_string( mEnemyPosition- > mY) ) : "nothing" ) << endl;
}
private :
char mId;
Point mPosition;
const Point* mEnemyPosition{ nullptr} ;
} ;
int main( )
{
Animal:: Pointer a{ new Animal{ 'A' , { 0 , 0 } } } ;
Animal:: Pointer b{ new Animal{ 'B' , { 0 , 0 } } } ;
a- > whatAttack( ) ;
b- > whatAttack( ) ;
{
Animal:: Pointer c{ new Animal{ 'C' , { 5 , 5 } } } ;
a- > attackEnemy( c- > getPosition( ) ) ;
b- > attackEnemy( c- > getPosition( ) ) ;
a- > whatAttack( ) ;
b- > whatAttack( ) ;
// C w miedzyczasie ginie z niewiadomych powodów
}
a- > whatAttack( ) ; // ?
b- > whatAttack( ) ; // ?
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY2xhc3MgQW5pbWFsCnsKcHVibGljOgoJdXNpbmcgUG9pbnRlciA9IHVuaXF1ZV9wdHI8QW5pbWFsPjsKIApwdWJsaWM6CglzdHJ1Y3QgUG9pbnR7IFBvaW50KGRvdWJsZSB4LCBkb3VibGUgeSkgOiBtWHt4fSwgbVl7eX17fSBkb3VibGUgbVgsIG1ZOyB9OwogCnB1YmxpYzoKCUFuaW1hbChjaGFyIGlkLCBQb2ludCBwb3NpdGlvbikgOiBtSWR7aWR9LCBtUG9zaXRpb257cG9zaXRpb259e30KIAoJfkFuaW1hbCgpCgl7CgkJZGVzdHJveSgpOwoJfQogCgl2b2lkIGF0dGFja0VuZW15KGNvbnN0IFBvaW50KiBlbmVteVBvc2l0aW9uKQoJewoJCW1FbmVteVBvc2l0aW9uID0gZW5lbXlQb3NpdGlvbjsKCX0KIAoJdm9pZCBkZXN0cm95KCkKCXsKCQljb3V0IDw8IG1JZCA8PCAiIGlzIGRlc3Ryb3llZCEiIDw8IGVuZGw7Cgl9CiAKCWNvbnN0IFBvaW50KiBnZXRQb3NpdGlvbigpIGNvbnN0Cgl7CgkJcmV0dXJuICZtUG9zaXRpb247Cgl9CiAKCXZvaWQgd2hhdEF0dGFjaygpIGNvbnN0Cgl7CgkJY291dCA8PCBtSWQgPDwgIiBhdHRhY2s6ICIgPDwgKG1FbmVteVBvc2l0aW9uID8gKHRvX3N0cmluZyhtRW5lbXlQb3NpdGlvbi0+bVgpICsgJyAnICsgdG9fc3RyaW5nKG1FbmVteVBvc2l0aW9uLT5tWSkpIDogIm5vdGhpbmciKSA8PCBlbmRsOwoJfQogCnByaXZhdGU6CgljaGFyIG1JZDsKCVBvaW50IG1Qb3NpdGlvbjsKCWNvbnN0IFBvaW50KiBtRW5lbXlQb3NpdGlvbntudWxscHRyfTsKfTsKIAppbnQgbWFpbigpCnsKCUFuaW1hbDo6UG9pbnRlciBhe25ldyBBbmltYWx7J0EnLCB7MCwgMH19fTsKCUFuaW1hbDo6UG9pbnRlciBie25ldyBBbmltYWx7J0InLCB7MCwgMH19fTsKIAoJYS0+d2hhdEF0dGFjaygpOwoJYi0+d2hhdEF0dGFjaygpOwogCgl7CgkJQW5pbWFsOjpQb2ludGVyIGN7bmV3IEFuaW1hbHsnQycsIHs1LCA1fX19OwogCgkJYS0+YXR0YWNrRW5lbXkoYy0+Z2V0UG9zaXRpb24oKSk7CgkJYi0+YXR0YWNrRW5lbXkoYy0+Z2V0UG9zaXRpb24oKSk7CgkJYS0+d2hhdEF0dGFjaygpOwoJCWItPndoYXRBdHRhY2soKTsKIAoJCS8vIEMgdyBtaWVkenljemFzaWUgZ2luaWUgeiBuaWV3aWFkb215Y2ggcG93b2TDs3cKCX0KIAoJYS0+d2hhdEF0dGFjaygpOyAvLyA/CgliLT53aGF0QXR0YWNrKCk7IC8vID8KfQ==