2010-11-05 47 views
1

Je crée un système d'entités basé sur des composants pour un moteur de jeu.C++: problème de circulaire conceptuel

I avoir une classe d'entité qui doit inclure l'en-tête de classe de base composant afin de définir la matrice de composants private Component* components[ 123 ]

Cependant, dans la classe de base composant I doivent définir un private Entity* ownerEntity, beacuse il est crucial qu'un composant sait à qui il appartient!

Il en résulte Entity.h besoin Component.h et vice-versa -> Référence circulaire

Comment puis-je résoudre ce problème?

Répondre

10

Tant que vous avez seulement besoin de votre classe pour contenir pointeurs ou références aux autres classes, vous pouvez sauter le vrai fichier à inclure et utiliser une déclaration avant vide comme class Component;.

Vous aurez besoin de l'inclusion complète dans le fichier source où vous déréférencer les pointeurs ou utiliser la référence pour appeler des méthodes sur Component.

+0

* Vraiment? * Génial! – Ricc

+2

En fait, dans les deux classes, vous n'avez besoin que de pointeurs, vous pouvez (devez!) Déclarer les dépendants au lieu de les inclure dans les deux en-têtes. Aucun des en-têtes dans ce cas ne devrait dépendre de l'autre; Cela fera un temps de compilation super-rapide. Rincez et répétez pour toutes les autres références, les pointeurs et leurs homologues const pour chaque classe. ** Aussi **: lisez [ce que Herb Sutter a à dire à propos des dépendances au moment de la compilation] (http://www.gotw.ca/gotw/007.htm). – wilhelmtell

+0

Vous pouvez pousser l'idée trop loin - j'ai une fois "habilement" retransmis automatiquement auto_ptr afin que je puisse avoir une classe de très bas niveau inclure une méthode toString() rarement utilisée retournant auto_ptr . Cela signifie que vous avez besoin de '#include ' partout où vous l'appelez *, et les erreurs que vous obtenez de gcc si vous ne le faites pas sont à peine intuitives. –