Допустим, в моей игре есть монстр, который может взорвать камикадзе на игрока. Давайте наугад выберем имя для этого монстра: 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, где удаления задерживаются до "чуть-чуть".