Question

J'écris un jeu et un moteur qui l'accompagne en C ++. Le moteur repose en grande partie sur l'automatisation à l'aide d'un simple langage de script. Les scripts peuvent créer des classes d'objets, définir des écouteurs d'événement sur eux, et produire des cas d'eux. À l'heure actuelle, une instance doit être lié à un identificateur global script afin de préserver son existence. Le résultat évident est qu'il ne peut y avoir aucun objet anonyme, qui sera de loin le plus commun.

À l'heure actuelle, les instances sont gérées à l'aide d'un std::set<Instance*, spatial_sort>, où spatial_sort est un foncteur qui trie les cas par la position, pour le rendu et la détection de collision. Les instances sont retirées et réinsérées chaque image en utilisant leur position actuelle comme une indication, dans l'hypothèse où ils ne sont pas susceptibles de se déplacer beaucoup dans un cinquantième de seconde. Si un drapeau de dead est défini dans l'instance, il est effacé de l'ensemble. Les constructeurs de Instance et destructor insert(this) et erase(this) invoquent respectivement.

Afin de permettre des cas anonymes, je veux changer l'ensemble à un std::set<boost::shared_ptr<Instance>, spatial_sort>, qui permettrait Instance de partager la propriété des instances et préserver leur existence jusqu'à ce qu'ils se détruisent. Malheureusement, parce que les appels à insert() doivent être placés dans le constructeur, shared_from_this() ne fonctionnera pas pour obtenir un shared_ptr au Instance. Peu importe à tout ce qui arrive Instance hériter déjà de boost::enable_shared_from_this<> par sa classe de base.

Quelqu'un peut-il recommander une solution de contournement appropriée?

Modifier

Je l'ai fait ce que je l'ai fait en premier lieu, et de diviser le comportement de la classe Instance en deux classes: Instance et Reference. Le new SomeClass d'expression dans un script renvoie alors un Reference à une nouvelle Instance. Les Instance objets eux-mêmes ne sont jamais gérés en utilisant un shared_ptr, ils sont responsables de se suicider en réponse à un événement approprié, par exemple, à la fin de l'animation, à la fin du niveau, etc.

Merci pour l'aide! Refactoring est aussi bonne solution que tout si elle fonctionne, tout simplement.

Était-ce utile?

La solution

Vous pouvez ajouter une méthode statique à Instance que vous utilisez ensuite pour créer de nouveaux objets et qui fait aussi les choses administratives comme l'ajout à l'ensemble:

static Instance* create(int something) {
  boost::shared_ptr<Instance> sptr(new Instance(something));
  instanceset.insert(sptr);
  return sptr.get();
}

Si vous voulez faire de cette seule façon de construire un objet de cette classe, vous pouvez également privé ou protégé le constructeur normal.

Pour en savoir plus sur ce sujet, voir aussi le C ++ FAQ Lite entrée à propos de , qui ne sont pas directement liés, mais utilise la même technique pour contourner les restrictions sur l'utilisation des fonctions virtuelles dans les constructeurs.

scroll top