Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de compilation - inclusion fichier Header

Sujet résolu
    16 janvier 2014 à 23:42:47

    Boujour / Bonsoir :)

    Alors voilà, je me retrouve avec une erreur redoutable :( : j’inclue un header contenant une classe, et lorsque je veux utiliser la classe en question : le compilateur me dit que l'objet n'est pas défini !

    Voici le code source (j'ai supprimé tout ce qui ne servait à rien : les méthodes/fonctions/variables inutiles). Dans un premier essai la compilation fonctionne correctement.

    Mais c'est lorsque j’inclue "Tank.h" (ou "TankFILS.h") dans le fichier "Boulet.h", que l'erreur apparaît.

    Voici le code source pour plus de précision : 

    main.cpp : 

    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include "TankFILS.h"
    #include "Tank.h"
    #include "Boulet.h"
    #include <vector>
    using namespace sf;
    using namespace std;
    
    int main()
    {return 0;}

    Boulet.cpp :

    #include "Boulet.h"
    #include <vector>
    #include "Tank.h"
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <cmath>
    using namespace std;
    using namespace sf;
    
    vector <float> tableauRemoveCases (vector<float> tableauRecois, int position)
    {}
    
    Boulet::Boulet(RenderWindow &fenetreRecois)
    {}
    
    void Boulet :: tirCannon(int position_X, int position_Y, float orientation)
    {}
    
    bool Boulet :: bouletDeplacement(int idBoulet)
    {return 1;}
    
    void Boulet :: gestion()//std::vector <Tank*> &tankTableau)
    {}



    Tank.cpp : 

    #include "Tank.h"
    #include "Boulet.h"
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    using namespace sf;
    
    Tank::Tank(RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY):boulet(bouletRecois)
    {}
    
    void Tank :: afficher ()
    {}
    
    void Tank :: deplacement()
    {}



    TankFILS.cpp :

    //#include "Tank.h"
    #include "TankFILS.h"
    #include "Boulet.h"
    #include <SFML/Graphics.hpp>
    #include <cmath>
    #include <iostream>
    using namespace sf;
    using namespace std;
    
    TankMoi::TankMoi(RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY): Tank(fenetreRecois, bouletRecois, positX, positY)
    {}
    
    void TankMoi :: deplacement()
    {}
    
    void TankMoi :: deplacementCannon()
    {}
    
    TankEnnemi :: TankEnnemi (sf::RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY): Tank(fenetreRecois, bouletRecois, positX, positY)
    {}
    
    void TankEnnemi :: deplacement()
    {}
    
    void TankEnnemi :: deplacementCannon()
    {}
    


    Tank.h :

    #ifndef TANK_H
    #define TANK_H
    #include <SFML/Graphics.hpp>
    #include <vector>
    #include "Boulet.h"
    
    class Tank
    {
        public:
            Tank(sf::RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY);
    
        protected:
        Boulet &boulet;
        void afficher();
        void deplacement();
    };
    
    #endif // TANK_H

    TankFILS.h :

    #ifndef TANKMOI_H
    #define TANKMOI_H
    #include "Tank.h"
    #include "Boulet.h"
    
    class TankMoi : public Tank
    {
    public:
        TankMoi(sf::RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY);
        void deplacement();
        void deplacementCannon();
    };
    
    class TankEnnemi : public Tank
    {
    public:
        TankEnnemi(sf::RenderWindow &fenetreRecois, Boulet &bouletRecois, int positX, int positY);
        void deplacement();
        void deplacementCannon();
    protected:
    };
    
    #endif // TANKMOI_H
    

    Boulet.h : 

    #ifndef BOULET_H
    #define BOULET_H
    #include <SFML/Graphics.hpp>
    #include <vector>
    //#include "TankFILS.h"   // L'erreur vient d'ici ! Losque j'inclu "TankFILS.h" ou "Tank.h", ça plante !
    
    class Boulet
    {
    public:
        Boulet(sf::RenderWindow &fenetreRecois);
        bool bouletDeplacement(int idBoulet);
        void tirCannon(int position_X, int position_Y, float orientation);
        void gestion();//std::vector <Tank*> &tankTableau);
    
    protected:
    };
    
    #endif // BOULET_H
    



    Voici le "Build log" (en ayant inclu "TankFILS.h" : 

    -------------- Build: Release in Mini Tank (compiler: GNU GCC Compiler)---------------
    
    mingw32-g++.exe -Wall -DSFML_DYNAMIC  -O2    -I"C:\Program Files (x86)\CodeBlocks\SFML\include" -I"C:\Program Files (x86)\CodeBlocks\SFML\include"  -c "D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.cpp" -o obj\Release\Boulet.o
    In file included from D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\TankFILS.h:3:0,
                     from D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.h:5,
                     from D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.cpp:1:
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Tank.h:10:47: error: 'Boulet' has not been declared
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Tank.h:13:5: error: 'Boulet' does not name a type
    In file included from D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.h:5:0,
                     from D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.cpp:1:
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\TankFILS.h:9:46: error: 'Boulet' has not been declared
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\TankFILS.h:17:49: error: 'Boulet' has not been declared
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.cpp: In function 'std::vector<float> tableauRemoveCases(std::vector<float>, int)':
    D:\Programme\PC\Programmation\Langage C++\Mini Tanks\TEST\Boulet.cpp:12:1: warning: no return statement in function returning non-void [-Wreturn-type]
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 1 warnings (0 minutes, 0 seconds)
     



     Vous savez tout ;)

    Merci d'avance pour votre aide !!

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2014 à 9:08:03

      Lu'!

      Tu as un problème d'inclusion croisée. Tu peux corriger en pré-déclarant tes classes :

      truc.h

      #ifndef _TRUC
      #define _TRUC
      
      class Machin;
      
      class Truc{
        void fonction(Machin& m);
      };
      
      #endif

      machin.h

      #ifndef _MACHIN
      #define _MACHIN
      
      class Truc;
      
      class Machin{
        void fonction(Truc& t);
      };
      
      #endif

      Tous les fichiers header correspondant doivent être (en revanche) inclus dans les fichiers source, sinon on n'a pas connaissance des fonctions disponibles pour chacune des classes.

      A noter : ici, c'est possible parce qu'on n'utilise pas de fonctions de la classe pré-déclarée dans le header. Si l'un des deux doit utiliser la fonction, il doit inclure le header de l'autre :

      truc.h

      #ifndef _TRUC
      #define _TRUC
      
      class Machin;
      
      class Truc{
        void fonction(Machin& m);
      };
      
      #endif

      machin.h :

      #ifndef _MACHIN
      #define _MACHIN
      
      #include "truc.h"
      
      class Machin{
        void fonction(Truc& t){ t.fonction(*this); }
      };
      
      #endif

      On ne peut pas faire ceci dans les deux sens (à moins de faire l'inclusion en milieu de header). Tu dois pouvoir corriger maintenant ;) .

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        17 janvier 2014 à 16:34:52

        Salut :), ça fonctionne !! :D  

        Merci pour les infos et d'avoir pris le temps de résoudre mon problème ! ;) 

        • Partager sur Facebook
        • Partager sur Twitter

        Problème de compilation - inclusion fichier Header

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown