2011-02-06 5 views
1

J'ai trois classes: une TopClass qui contient une instance d'un pointeur BottomClass. Le BottomClass contient un pointeur vers un HelperClass. Le HelperClass conserve un pointeur sur le TopClass. La dépendance circulaire apparaît et une déclaration avant est nécessaire dans le HelperClass.Pourquoi une déclaration forward ne corrige-t-elle pas la dépendance circulaire?

Tout cela est illustré avec les extraits de code suivant:

#include "BottomLevel.h" 

namespace foo 
{ 
    class TopLevel 
    { 
    private: 
    BottomLevel* item; 
    }; 
} 

-

#include "HelperClass.h" 

namespace foo 
{ 
    class BottomLevel 
    { 
    private: 
    HelperClass* item; 
    }; 
} 

-

class TopLevel; // forward declaration here 

namespace foo 
{ 
    class HelperClass 
    { 
    public 
    HelperClass(TopLevel* item); 
    }; 
} 

Le problème vient en essayant de faire des choses dans le fichier de mise en œuvre . Si je #include "TopClass.h" dans le fichier cpp, je reçois des erreurs de compilation indiquant "fonction de membre surchargé non trouvé - utilisation de type indéfini 'TopLevel'" (ERREURS C2511 et C2027).

Ensuite, si je ne fais pas le #include je suis encore à gauche avec des erreurs C2027 parce que j'essaie d'utiliser le type forward forward. Je sais juste qu'il existe une méthode pour résoudre ce problème, je suis sûr que je l'ai déjà fait, mais je ne peux pas me souvenir de ce que je suis censé faire. Toute aide s'il vous plaît?

Répondre

6

Le problème est que vous déclarer avant TopLevel en dehors de l'espace de noms foo de sorte que le compilateur ne jamais trouver la classe foo::TopLevel. Essayez de déplacer la déclaration avant de TopLevel à l'intérieur de l'espace de noms foo.

+0

/facepalm - Vous monsieur, me humilierez. Merci! – Anthony

0

Vous avez besoin d'une déclaration avant de la forme

namespace foo { 
class TopLevel; 
class BottomLevel; 
class HelperClass; 
} 

Ensuite l'ordre wont question [parce que vous utilisez des pointeurs]

+6

Accordez-vous la semaine prochaine pour un autre épisode passionnant de Stack Overflow, où Shynthriir découvre exactement ce qu'il doit mettre! – Maxpm

+0

désolé était en train de taper la dernière partie dans la mauvaise fenêtre :) –