2010-10-10 3 views
3

J'utilise #pragma une fois, pas #include des gardes sur tous mes fichiers h. Que dois-je faire si a.h doit #include b.h et b.h doit #include a.h?Façon correcte de #include quand il y a une dépendance circulaire?

Je reçois toutes sortes d'erreurs parce que, ce faisant, le pragma prend une fois effet et l'un d'entre eux manque l'un à l'autre. Comment dois-je faire cela?

Merci

+0

Nombreux doublons: http: // stackoverflow.com/questions/1748624/circulaire-dépendances-de-déclarations, et http://stackoverflow.com/questions/1655096/c-class-its-base-class-and-circular-include-includes pour n'en nommer que quelques-uns –

Répondre

4

Vous devez transmettre les définitions dont vous avez besoin. Donc, si A utilise B comme valeur de paramètre, vous devez renvoyer déclarer B, et vice versa.

Il se pourrait que simplement déclarer avant les noms de classe:

class A; 
class B; 

permet de résoudre vos problèmes.

La réponse acceptée à this question fournit des conseils supplémentaires.

2

Une possibilité consiste à factoriser une partie des fichiers a.h et b.h dans un troisième fichier dire c.h, et l'inclure à la fois a.h et b.h. De cette façon, les deux derniers n'auront plus besoin de se comprendre mutuellement.

Une autre possibilité consiste à fusionner les fichiers d'en-tête séparés en un seul.

Une troisième possibilité est la situation où deux classes doivent légitimement se référer les unes aux autres. Dans ce cas, vous devez utiliser les pointeurs. De plus, vous pouvez renvoyer déclarer la classe au lieu d'inclure son fichier d'en-tête. [Ils ont également mentionné par jdv] Par exemple,

// file a.h 
struct B; 
struct A { B * b_ }; 

// file b.h 
struct A; 
struct B { A * a_; }; 

Cependant, sans connaître votre situation particulière, il est difficile de fournir des suggestions spécifiques.

0

Cela dépend de ce qui est nécessaire du fichier d'en-tête de l'autre. Si c'est une définition de classe, mais il est seulement à l'aide d'un pointeur vers la classe, puis au lieu d'inclure le fichier de la tête vient de mettre dans une déclaration en avant comme:

class MyClassA;

0

La solution de ce problème est « déclaration avant '.

Si vous avez une classe ou une fonction qui doit être utilisée dans 2 en-têtes, l'un des en-têtes doit renvoyer la classe ou le type utilisé. Ou vous devez envisager de restructurer vos en-têtes.

Ceci est un problème débutant commun que les dépendances circulaires provoquent de tels problèmes. Si vous google sur «déclaration avant», vous trouverez des tonnes de résultats.

Étant donné que votre question était trop vague, je ne peux pas vous donner une réponse exacte, désolé pour cela.

0

Vous ne pouvez pas utiliser les types incomplets, mais vous pouvez simplement les transférer. Vous dites simplement au compilateur: "N'obtenez pas d'erreurs de syntaxe, je sais ce que je fais". Ce qui signifie que l'éditeur de liens ira chercher des types complets dans les bibliothèques.

Questions connexes