7
如何避免游戏对象在C ++中意外删除自身
假设我的游戏中有一个怪物,可以让神风敢死队在玩家身上爆炸。让我们随机选择一个怪物的名字:爬行者。因此,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 ++中,对于对象从其方法之一内部意外删除自身的问题,是否有更好的一般解决方案?
20
c++
scene-graph