Déclarations de classes mutuellement dépendantes

J’essaie de comprendre ce que cette erreur de compilation signifie, et j’espère bien l’expliquer.

In file included from sys/charon.cpp:4:0: 

Après cela me mène au fichier ^ ci-dessus, et souligne en jaune ceci:

 #include "../headers/charon.h" 

De même, l’identificateur de type “charon_”, qui est une classe définie dans le fichier d’en-tête charon.h, est également souligné en jaune, éventuellement une erreur différente.

 sys/../headers/charon.h:17:9: error: redefinition of 'class charon::charon_' sys/../headers/chio.h:86:9: error: previous definition of 'class charon::charon_' sys/charon.cpp:12:20: error: definition of implicitly-declared 'charon::charon_::charon_()' 

Cependant, j’espère qu’ils sont tous liés à la première erreur, je pense que c’est lié à quelque chose que j’essaie de faire.

 //File 1.h /**********/ class I { private: B* my_private_b; public: I(B& handle); } 

Malheureusement, j’ai besoin que ‘B’ soit déclaré avant que le ‘fichier 1’ ne commence à définir ‘I’ .. mais en même temps, j’ai besoin que je sois défini pour B. Donc, je ne sais pas comment définir les deux avant l’autre. I Je devine que j’ai besoin d’une solution plus avancée mais je ne sais pas.

 //File 2.h /***********/ class B { private: I i; O o; public: B(); } 

Donc, si je peux trouver une réponse à cette question, je pourrais peut-être vérifier cette partie suivante de mon côté. Si vous pensez qu’il serait bon de vérifier si je vais dans la bonne direction, je collerai tout le code en question ci-dessous.

………………………….. .

Pas assez longtemps, vous n’avez pas lu? Eh bien voici toutes les lignes, à l’exception des commentaires, du code des quatre fichiers. Par ordre d’importance perçue.

 ////////////////////////////////////// ///// ///////////// ///// ///// ///// //File: chio.h #ifndef CHIO_H #define CHIO_H #include  #include  #include  using namespace std; namespace charon { class charon_ { }; } namespace chio { class chout_ { private: public: chout_(); ~chout_(); }; class chin_ { private: charon::charon_* engine; public: chin_(charon::charon_& handle); chin_(); ~chin_(); }; } #endif /* CHIO_H */ ////////////////////////////////////// ///// ///////////// ///// ///// ///// //File: charon.h/* // * File: charon.h * Author: josh * * Created on 11 April 2012, 22:26 */ #ifndef CHARON_H #define CHARON_H //#include "boost/thread.hpp" #include "chio.h" using namespace std; using namespace chio; namespace charon { class charon_ { private: chout_ engine_output; chin_ engine_input; //boost::thread input_thread; //boost::thread output_thread; void start_threads(); void stop_threads(); public: charon_(); charon_(charon_ &orig); ~charon_(); void run(); }; } #endif /* CHARON_H */ 

Ce sont les fichiers constructors / cpp.

 charon.cpp #include  //#include  //#include  #include "../headers/charon.h" using namespace std; using namespace charon; using namespace chio; namespace charon { charon_::charon_(){ engine_input = chio::chin_((charon_*)this); } }; //^^charon.cpp^^ --------- //chin.cpp #include  #include  #include  #include  #include "../headers/charon.h" using namespace std; using namespace charon; using namespace chio; namespace chio { chin_::chin_(charon::charon_& handle) { engine = handle; } chin_::~chin_() { } } 

Et pour la finale, je déteste personnellement lire, alors je me suis contenté de demander tout cela à qui que ce soit. Donc, si vous êtes venus jusque-là, vous le souhaitez probablement aussi.

 "/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf gmake[1]: Entering directory `/home/josh/Projects/Maze/Charon' "/usr/bin/gmake" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/charon gmake[2]: Entering directory `/home/josh/Projects/Maze/Charon' mkdir -p build/Debug/GNU-Linux-x86/sys rm -f build/Debug/GNU-Linux-x86/sys/charon.od g++ -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/sys/charon.od -o build/Debug/GNU-Linux-x86/sys/charon.o sys/charon.cpp In file included from sys/charon.cpp:4:0: sys/../headers/charon.h:17:9: error: redefinition of 'class charon::charon_' sys/../headers/chio.h:86:9: error: previous definition of 'class charon::charon_' sys/charon.cpp:12:20: error: definition of implicitly-declared 'charon::charon_::charon_()' gmake[2]: *** [build/Debug/GNU-Linux-x86/sys/charon.o] Error 1 gmake[2]: Leaving directory `/home/josh/Projects/Maze/Charon' gmake[1]: *** [.build-conf] Error 2 gmake[1]: Leaving directory `/home/josh/Projects/Maze/Charon' gmake: *** [.build-impl] Error 2 

Je serais simplement content d’avoir une réponse à ma version simplifiée. Je suis à court d’idées pour corriger les erreurs de compilation et j’ai feuilleté mon énorme référence C ++ en vérifiant tout ce à quoi je peux penser. Toute la syntaxe semble correcte, je pense que c’est juste que je n’ai pas encore appris à manipuler le compilateur pour faire des choses comme ça.

Je ne sais pas, je suis probablement en train de me perdre. Cela m’a frustré pendant les 3 derniers jours au moins.

Il semble que dans File1.h une déclaration avancée de B suffirait au lieu de l’inclure, car vous n’utilisez que des références et des pointeurs vers B Ajouter:

 class B; // << Forward declaration of B class I { private: B* my_private_b; public: I(B& handle); } 

au début de File1.h

Un problème est que ce n’est pas une déclaration, mais une définition:

 namespace charon { class charon_ { }; } 

Vous dites non seulement que charon_ est une classe dans un espace de noms charon , vous dites également qu’elle est vide. Vous n’êtes alors pas autorisé à append des membres de classe plus tard.

Une meilleure façon est

 namespace charon { class charon_; } 

qui indique simplement au compilateur que la classe existe, mais laisse de côté les détails.