Angenommen, in meinem Spiel befindet sich ein Monster, das Kamikaze auf dem Spieler explodieren lassen kann. Lass uns zufällig einen Namen für dieses Monster auswählen: einen Creeper. Die Creeper
Klasse hat also eine Methode, die ungefähr so aussieht:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Die Ereignisse werden nicht in die Warteschlange gestellt, sondern sofort versendet. Dies bewirkt, dass das Creeper
Objekt irgendwo innerhalb des Aufrufs von gelöscht wird postEvent
. Etwas wie das:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Da das Creeper
Objekt gelöscht wird, während die kamikaze
Methode noch ausgeführt wird, stürzt es beim Zugriff ab this->location()
.
Eine Lösung besteht darin, die Ereignisse in einen Puffer zu stellen und sie später zu versenden. Ist das die übliche Lösung in C ++ - Spielen? Es fühlt sich wie ein Hack an, aber das könnte nur an meiner Erfahrung mit anderen Sprachen mit anderen Speicherverwaltungsmethoden liegen.
Gibt es in C ++ eine bessere allgemeine Lösung für dieses Problem, bei der sich ein Objekt versehentlich aus einer seiner Methoden löscht?
autorelease
in Objective-C werfen , wo Löschungen "nur für ein bisschen" zurückgehalten werden.