2010-08-10 3 views
3

J'ai 2 classes - une tenant l'information d'entité autre tenant l'information de composant. Maintenant le problème est que la classe Entity a besoin de la classe Component déjà définie pour l'utiliser dans le vecteur des enfants, mais en même temps, Component a besoin de l'entité pour le déclarer comme parent (je garde tout lié entre). Cela met des erreurs étranges, même si IntelliSense dit que tout est déjà défini.Inclure le désordre de dossier

Comment puis-je surmonter cette difficulté?

Répondre

6

component.h:

class Entity; 
class Component { 
    ... 
    Entity *parent; 
}; 

entity.h:

#include "component.h" 
class Entity { 
    ... 
} 

Le seul inconvénient est ici que les méthodes inline dans component.h ne peuvent pas utiliser des méthodes d'entité.

+0

Cela a fonctionné merci! Toujours juste au cas où j'aimerais voir s'il y a un moyen de pointer les méthodes _and_ use. Des conseils? – Johnny

+0

Vous pouvez utiliser des méthodes dans le fichier .cpp, mais pas l'en-tête. –

+0

Vous pouvez certainement avoir des méthodes dans la classe Component qui appellent les méthodes Entity, vous ne pouvez pas les avoir en ligne dans le fichier .h. Vous devrez ajouter un prototype pour eux dans la classe, puis avoir l'implémentation dans le fichier component.cpp (qui comprend à la fois component.h et entity.h). –

3

Il semble que vous avez ceci:

Entity.h:

#include <vector> 

class Entity { 
public: 
    std::vector<Component> children; 
}; 

Component.h:

#include <Entity.h> 

class Component : public Entity { ... }; 

Une façon de contourner la question est de transmettre-déclarer la classe Component et utiliser un vector de pointeurs vers Component s:

Entity.h:

#ifndef ENTITY_H 
#define ENTITY_H 
#include <vector> 

class Component; // Forward declaration. 

class Entity { 
public: 
    std::vector<Component*> children; 
}; 

#endif /* ndef ENTITY_H */ 

Component.h:

#ifndef COMPONENT_H 
#define COMPONENT_H 
#include <Entity.h> // To allow inheritance. 

class Component : public Entity { ... }; 

#endif /* ndef COMPONENT_H */ 

Entity.cpp:

#include <Entity.h> 
#include <Component.h> // To access Component members. 
+0

Aaah, vous conseille de le mettre dans le fichier cpp, et faire une déclaration avant dans l'en-tête? Merci! C'est probablement ce dont j'ai besoin! Encore une chose me dérange, vous avez inclus Entity.h, alors vous incluez Component.h, cela n'inclurait-il pas Entity deux fois? Peut-être que je pourrais utiliser une définition pour ignorer l'Entité dans compoenent.h? – Johnny

+0

J'ai omis les gardes d'inclure pour la brièveté, car ils sont assez pratique courante. Je vais les mettre pour l'exhaustivité. –

1

Une option est si vous utilisez seulement des pointeurs à Component dans votre vector (ie vector<Component*> (ou un smart ptr va riant) au lieu de vector<Component>), vous pouvez renvoyer déclarer la classe Component et votre déclaration de classe Entity n'aurait pas besoin de la définition Component.

+0

J'utilise le vecteur , mais cela ne le résout pas car j'ai besoin d'un ptr de cette entité à assigner à pParent dans l'objet Copmonent. – Johnny

+0

Ecrivez-vous tout le code dans les fichiers d'en-tête? Vous ne voulez généralement que faire des déclarations dans le fichier d'en-tête. Si vous transférez declare ('class Component;') avant votre définition 'Entity', vous n'aurez pas à inclure' Component.h' dans votre fichier d'en-tête. Vous en aurez besoin dans le fichier source lorsque vous initialisez/utilisez réellement votre objet 'Component', mais en incluant' Component.h' dans 'Entity.cpp' n'introduit pas de référence circulaire. – bshields

+0

Bien sûr que non, l'en-tête est seulement pour les définitions. Cependant, je l'ai compris - je les inclus dans les fichiers source, et en utilisant #ifndef inclure la protection (vous savez ce que je veux dire). – Johnny

Questions connexes