2010-08-04 6 views
3

J'ai un modèle d'inclusion comme suit: « « Class1_namespace » ne désigne pas un type »problème Inclusion

/* 
* Class1.h 
*/ 

#ifndef CLASS1_H_ 
#define CLASS1_H_ 

#include "Class2.h" 

namespace Class1_namespace 
{ 

class Class1 
{ 
    Class2* Class2_ptr; 
    void Class1_member() 
    { 
     (*Class2_ptr).Class2_method(); 
    } 
}; 

} 

#endif /* CLASS1_H_ */ 

/* 
* Class2.h 
*/ 

#ifndef CLASS2_H_ 
#define CLASS2_H_ 

#include "Class1.h" 

class Class2 
{ 
    Class1_namespace::Class1 Class2_data; 

public: 
    void Class2_method(){}; 
}; 

#endif /* CLASS2_H_ */ 

/* 
* main.cpp 
*/ 

#include "Class1.h" 

int main() 
{ 
    return 0; 
} 

Cependant, cela conduit à l'erreur

Est-ce une erreur provoquée par l'ordre de mes inclusions?

Quelles sont les solutions possibles? Je suis douteux au sujet des déclarations anticipées résolvant mon problème.

Répondre

2

Class1 n'a pas besoin d'inclure Class2. Lorsque vous avez une dépendance mutuelle (ce qui n'est pas le cas - vous ne pouvez pas inclure 2 en 1), vous pouvez généralement le résoudre en utilisant des déclarations directes plutôt que des inclusions.

Par exemple, disons que Class1 ressemblait à ce

#include "Class2.h" 

namespace Class1_namespace 
{ 

    class Class1 
    { 
     Class2* class2; 
    }; 

} 

où vous pensez que vous avez besoin d'inclure, vous pouvez le faire à la place:

class Class2; 

namespace Class1_namespace 
{ 

    class Class1 
    { 
     Class2* class2; 
    }; 

} 

pour briser l'inclusion mutuelle.

+0

L'inclusion mutuelle est-elle toujours à éviter ou juste quand les déclarations anticipées suffisent? – user383352

+0

L'inclusion mutuelle est un symptôme des dépendances cycliques, qui devraient être évitées si possible. Si vous devez avoir la dépendance cyclique, elle ne peut être traitée que si l'un des types peut être déclaré en avant. Sinon, vous ne serez pas en mesure de compiler votre code. –

+0

Si vous pensez à ce que fait vraiment le #include, vous verrez pourquoi il ne pourrait pas fonctionner comme vous l'avez fait. Le but du préprocesseur est de produire un fichier unique qui est ensuite compilé. Le compilateur fait un seul passage à travers ce fichier, donc tout ce qui est nécessaire pour une classe doit venir avant. Exécutez votre paramètre de compilateur pour juste pré-traiter et regarder le fichier de résultat - vous verrez qu'il est impossible de le compiler sous ces contraintes. –

0

Dans class1.h, essayez de supprimer le #include inutile et circulaire de class2.h. Si une dépendance circulaire est requise, ou même si elle ne l'est pas, pensez à utiliser les déclarations forward.

Questions connexes