मान लीजिए कि मेरे खेल में एक राक्षस है जो खिलाड़ी पर विस्फोट कर सकता है। चलो यादृच्छिक पर इस राक्षस के लिए एक नाम चुनें: एक लता। तो, 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
ऑब्जेक्टिव-सी के कार्यान्वयन पर भी एक नज़र डाल सकते हैं , जहां "बस थोड़ा सा" तक विलोपन किया जाता है।