#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
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( Animal* enemy)
{
mEnemyTarget = enemy;
enemy- > addEnemyAttacker( this ) ;
}
void destroy( )
{
cout << mId << " is destroyed!" << endl;
if ( mEnemyTarget) mEnemyTarget- > notifyEnemyAttackerIsDown( this ) ;
for_each( mEnemyAttackers.begin ( ) , mEnemyAttackers.end ( ) , mem_fn( & Animal:: notifyEnemyTargetIsDown ) ) ;
}
char getId( ) const
{
return mId;
}
const Point* getPosition( ) const
{
return & mPosition;
}
void whatAttack( ) const
{
cout << mId << " attack: " << ( mEnemyTarget ? ( mEnemyTarget- > getId( ) + string( " " ) + to_string( mEnemyTarget- > getPosition( ) - > mX) + ' ' + to_string( mEnemyTarget- > getPosition( ) - > mY) ) : "nothing" ) << endl;
}
private :
void addEnemyAttacker( Animal* enemyAttacker)
{
mEnemyAttackers.push_back ( enemyAttacker) ;
}
void notifyEnemyAttackerIsDown( Animal* enemyAttacker)
{
mEnemyAttackers.erase ( remove_if( mEnemyAttackers.begin ( ) , mEnemyAttackers.end ( ) , [ enemyAttacker] ( Animal* attacker) { return attacker == enemyAttacker; } ) , mEnemyAttackers.end ( ) ) ;
}
void notifyEnemyTargetIsDown( )
{
mEnemyTarget = nullptr;
}
private :
char mId;
Point mPosition;
Animal* mEnemyTarget{ nullptr} ;
vector< Animal* > mEnemyAttackers;
} ;
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.get ( ) ) ;
b- > attackEnemy( c.get ( ) ) ;
a- > whatAttack( ) ;
b- > whatAttack( ) ;
// C w miedzyczasie ginie z niewiadomych powodów
}
a- > whatAttack( ) ; // ok
b- > whatAttack( ) ; // ok
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFuaW1hbAp7CnB1YmxpYzoKCXVzaW5nIFBvaW50ZXIgPSB1bmlxdWVfcHRyPEFuaW1hbD47CgpwdWJsaWM6CglzdHJ1Y3QgUG9pbnR7IFBvaW50KGRvdWJsZSB4LCBkb3VibGUgeSkgOiBtWHt4fSwgbVl7eX17fSBkb3VibGUgbVgsIG1ZOyB9OwoKcHVibGljOgoJQW5pbWFsKGNoYXIgaWQsIFBvaW50IHBvc2l0aW9uKSA6IG1JZHtpZH0sIG1Qb3NpdGlvbntwb3NpdGlvbn17fQoKCX5BbmltYWwoKQoJewoJCWRlc3Ryb3koKTsKCX0KCgl2b2lkIGF0dGFja0VuZW15KEFuaW1hbCogZW5lbXkpCgl7CgkJbUVuZW15VGFyZ2V0ID0gZW5lbXk7CgkJZW5lbXktPmFkZEVuZW15QXR0YWNrZXIodGhpcyk7Cgl9CgoJdm9pZCBkZXN0cm95KCkKCXsKCQljb3V0IDw8IG1JZCA8PCAiIGlzIGRlc3Ryb3llZCEiIDw8IGVuZGw7CgkJaWYobUVuZW15VGFyZ2V0KSBtRW5lbXlUYXJnZXQtPm5vdGlmeUVuZW15QXR0YWNrZXJJc0Rvd24odGhpcyk7CgkJZm9yX2VhY2gobUVuZW15QXR0YWNrZXJzLmJlZ2luKCksIG1FbmVteUF0dGFja2Vycy5lbmQoKSwgbWVtX2ZuKCZBbmltYWw6Om5vdGlmeUVuZW15VGFyZ2V0SXNEb3duKSk7Cgl9CgoJY2hhciBnZXRJZCgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1JZDsKCX0KCgljb25zdCBQb2ludCogZ2V0UG9zaXRpb24oKSBjb25zdAoJewoJCXJldHVybiAmbVBvc2l0aW9uOwoJfQoKCXZvaWQgd2hhdEF0dGFjaygpIGNvbnN0Cgl7CgkJY291dCA8PCBtSWQgPDwgIiBhdHRhY2s6ICIgPDwgKG1FbmVteVRhcmdldCA/IChtRW5lbXlUYXJnZXQtPmdldElkKCkgKyBzdHJpbmcoIiAiKSArIHRvX3N0cmluZyhtRW5lbXlUYXJnZXQtPmdldFBvc2l0aW9uKCktPm1YKSArICcgJyArIHRvX3N0cmluZyhtRW5lbXlUYXJnZXQtPmdldFBvc2l0aW9uKCktPm1ZKSkgOiAibm90aGluZyIpIDw8IGVuZGw7Cgl9Cgpwcml2YXRlOgoJdm9pZCBhZGRFbmVteUF0dGFja2VyKEFuaW1hbCogZW5lbXlBdHRhY2tlcikKCXsKCQltRW5lbXlBdHRhY2tlcnMucHVzaF9iYWNrKGVuZW15QXR0YWNrZXIpOwoJfQoKCXZvaWQgbm90aWZ5RW5lbXlBdHRhY2tlcklzRG93bihBbmltYWwqIGVuZW15QXR0YWNrZXIpCgl7CgkJbUVuZW15QXR0YWNrZXJzLmVyYXNlKHJlbW92ZV9pZihtRW5lbXlBdHRhY2tlcnMuYmVnaW4oKSwgbUVuZW15QXR0YWNrZXJzLmVuZCgpLCBbZW5lbXlBdHRhY2tlcl0oQW5pbWFsKiBhdHRhY2tlcikgeyByZXR1cm4gYXR0YWNrZXIgPT0gZW5lbXlBdHRhY2tlcjsgfSksIG1FbmVteUF0dGFja2Vycy5lbmQoKSk7Cgl9CgoJdm9pZCBub3RpZnlFbmVteVRhcmdldElzRG93bigpCgl7CgkJbUVuZW15VGFyZ2V0ID0gbnVsbHB0cjsKCX0KCnByaXZhdGU6CgljaGFyIG1JZDsKCVBvaW50IG1Qb3NpdGlvbjsKCUFuaW1hbCogbUVuZW15VGFyZ2V0e251bGxwdHJ9OwoJdmVjdG9yPEFuaW1hbCo+IG1FbmVteUF0dGFja2VyczsKfTsKCmludCBtYWluKCkKewoJQW5pbWFsOjpQb2ludGVyIGF7bmV3IEFuaW1hbHsnQScsIHswLCAwfX19OwoJQW5pbWFsOjpQb2ludGVyIGJ7bmV3IEFuaW1hbHsnQicsIHswLCAwfX19OwoKCWEtPndoYXRBdHRhY2soKTsKCWItPndoYXRBdHRhY2soKTsKCgl7CgkJQW5pbWFsOjpQb2ludGVyIGN7bmV3IEFuaW1hbHsnQycsIHs1LCA1fX19OwoKCQlhLT5hdHRhY2tFbmVteShjLmdldCgpKTsKCQliLT5hdHRhY2tFbmVteShjLmdldCgpKTsKCQlhLT53aGF0QXR0YWNrKCk7CgkJYi0+d2hhdEF0dGFjaygpOwoKCQkvLyBDIHcgbWllZHp5Y3phc2llIGdpbmllIHogbmlld2lhZG9teWNoIHBvd29kw7N3Cgl9CgoJYS0+d2hhdEF0dGFjaygpOyAvLyBvawoJYi0+d2hhdEF0dGFjaygpOyAvLyBvawp9Cg==