2009-10-11 8 views
2

J'écris un gestionnaire d'état pour un jeu. J'ai la plupart de la logique pour la façon dont je veux faire ça. Je veux que les états, qui seront des classes, soient gérés dans une pile de la classe StateManager. Chaque état aura des fonctions de pause, et la pile sera une pile STL.Puis-je supprimer une classe allouée dynamiquement en utilisant une fonction dans cette classe?

Lorsqu'un état est fait avec ce qu'il doit faire (par exemple: à partir de l'écran de pause, l'utilisateur clique « de retour au jeu »), il doit être retiré de la pile et supprimés. Ma logique actuelle (que je suis incapable de tester, malheureusement) serait:

Etat termine son travail. Dans sa fonction de mise à jour, quand il trouve que c'est fait, il appellera une fonction pour nettoyer l'état. Cette fonction prendra soin de toutes les extrémités libres immédiates qui doivent être liés (s'il y en a), appelez la fonction pop de la pile de gestion de l'Etat, et se supprimer.

Ce que je demande est: puis-je supprimer une classe à partir de lui-même?

Répondre

0

Vous pouvez, il est même possible d'appeler:

delete this; 

Mais il est le genre de poilu et laid et peut-être dangereux ...

connexes:

+0

Eh bien, est-il une meilleure méthode? Ma deuxième idée était d'avoir une variable "is_done" ou quelque chose que le gestionnaire d'état vérifie chaque cycle et pop et supprime les états qui sont "terminés". Je ne sais pas à quel point cela serait coûteux. – sonicbhoc

+0

Vous pourriez avoir quelque chose comme la méthode QObject :: deleteLater() de Qt ... il ajoute l'objet à une liste, et à un moment ultérieur (par exemple au début de l'itération suivante via votre boucle d'événement) tout dedans. Il peut être judicieux de définir également un indicateur in_delete_laterlist dans l'objet, et deleteLater() vérifie cet indicateur, de sorte que si deleteLater() est appelé plus d'une fois sur l'objet, il ne sera pas ajouté à la liste deux fois et supprimé deux fois. –

0

Bien sûr:

void cleanup(){ 
delete this; 
} 

Bien sûr, il y a beaucoup de choses que vous devez être sûr (et non le moindre, est que vous aurez badness si vous essayez de le faire avec une instance qui a été créé sur la pile.

0

Oui - delete this; est valide. Assurez-vous juste que c'est la dernière chose liée à la classe qui est faite dans la fonction qui fait la suppression.

Questions connexes