8
votes

L'en-tête circulaire C ++ comprend

Je sais que des questions similaires à cela ont été posées avant, sauf après mes recherches, j'ai toujours des questions sur l'en-tête circulaire. XXX

MAINTENANT si j'ai deux dépendances circulaires c'est la voie que j'ai vu des gens sur Stackoverflow se déplacent autour du problème. Mon seul problème avec ceci est que dans mon principal.cpp je dois d'abord inclure Fooa.h d'abord, puis foob.h xxx

maintenant ma question est "Y a-t-il un moyen de transmettre Déclarez ces classes d'une manière qui me permettra de ne pas vous soucier de l'ordre dans lequel j'inclus les fichiers d'en-tête de mon.cpp? "


2 commentaires

Comme les réponses ont signalé, vous pouvez utiliser une déclaration à terme dans les deux fichiers. Si la situation était plus compliquée, vous pourriez #include "fooa.h" à partir de foob.h , ce qui garantirait l'ordre incluant que vous voulez.


Il n'y a rien de circulaire dans l'inclusion dans le code exemple. Si vous ajoutez le # endif manquant, tout va bien. Quelle erreur compilée obtenez-vous?


4 Réponses :


3
votes

Vous n'avez pas à vous soucier de la commande car fooa.h inclut foob.h et foob.h a l'avant Déclaration pour FOOA . Tout est déjà correct dans votre code.


1 commentaires

MODULO Le # endif manquant, il n'y a pas de problème du tout avec le code comme publié. Il n'y a pas de circularité, non plus, ce qui me fait suspecter qu'il manque quelque chose.



13
votes

Y a-t-il un moyen de transmettre ces classes d'une manière qui me permettra de ne pas se soucier de l'ordre dans lequel j'inclus les fichiers d'en-tête dans mon.cpp? p>

Étant donné que vous avez affaire à des pointeurs simples uniquement, vous pouvez utiliser une déclaration en avant ici dans les deux cas: p>

FOOA.H P>

#ifndef H_FOOB
#define H_FOOB

class FooA;
class FooB{
   public:
      FooA *fooA;
};
#endif

4 commentaires

@ user1600812 Exactement, et le principal peut inclure les fichiers dont il a besoin - en utilisant cet exemple, la commande n'aura pas d'importance.


Je suppose que j'ai oublié de mentionner cela dans mon code spécifique. FOOA.H TRANGER s'est déclaré parce qu'il y a quelques pointeurs auto-référencés dans mon code. Dans mon cas particulier, je ne pense pas que vous puissiez le faire votre chemin parce que je ferais de l'avant déclarant une classe deux fois. Cependant, dans l'exemple que j'ai apporté au-dessus de vos travaux de solution. Merci.


@ user1600812 C ++ permet des déclarations à terme multiples (par exemple dans des fichiers séparés).


@ User1600812 - Il n'y a pas de problème avec plusieurs déclarations à terme dans le même dossier tant qu'ils sont cohérentes.



1
votes

Comme les deux classes contiennent simplement un pointeur, vous n'avez pas besoin d'inclure l'autre en-tête. Une déclaration à terme fera.

n'importe quel code qui utilise réellement l'autre classe Besoin de l'en-tête, mais qui devrait figurer dans un fichier CPP.


0 commentaires

1
votes

Utilisez un déclarer en avant dans les deux fichiers d'en-tête.

Saviez-vous que vous pouvez le déclarer sur la même ligne? p>

dans "foob.h" p> xxx Pré>

dans "FOOA.H" P>

class FooA {
    public:
        class FooB *fooB;
};


1 commentaires

Cela ne fera-t-il pas de faire référence à FOOB :: FOOA et FOOA :: FOOB respectivement?