Скажімо, у моїй грі є монстр, який може камікадзе вибухнути на гравці. Виберемо назву для цього монстра навмання: Creeper. Отже, у Creeper
класі є метод, який виглядає приблизно так:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Події не в черзі, вони відправляються негайно. Це призводить Creeper
до видалення об'єкта десь усередині виклику postEvent
. Щось на зразок цього:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Оскільки Creeper
об’єкт видаляється, поки kamikaze
метод все ще працює, він припинить роботу при спробі доступу this->location()
.
Одне з варіантів - це чергувати події в буфер і відправляти їх пізніше. Це загальне рішення в іграх на C ++? Це здається, що це трохи зламало, але це може бути просто через мій досвід роботи з іншими мовами з різними методами управління пам'яттю.
Чи є в C ++ краще загальне рішення цієї проблеми, коли об'єкт випадково видаляє себе всередині одного зі своїх методів?
autorelease
в Objective-C, де видалення затримано до "лише трохи".