IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme de forward declaration


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut Probleme de forward declaration
    re bonjour !

    g voulu résoudre un problème d'inclusion circulaire avec une forward declaration
    entre deux .h

    Animal.h et Faune.h

    du coté de Faune tout roule , mais pour animal g voulu implémenter une méthode utilitaire qui utilise faune et ses méthodes

    mais voila les erreur que ces méthodes occasionnent:

    In member function `void Lapin::avoirBebeLapin(Faune&, int)'
    invalid use of undefined type `struct Faune'
    forward declaration of `struct Faune'

    Idem pour avoirBeBeRenard(Faune &, int)

    voici les sources des .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    #ifndef _ANIMAL
    #define _ANIMAL
     
    #include "./Para.h"
    #include "./Faune.h"
    #include "./Monde.h"
    #include <time.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
     
     
    int refGenerale=0;
     
    class Faune;
     
     
    class Animal{
          int wAge;
          int wSex; // 0 male, 1 femelle
          bool wIfDead;
          int wEnergy;
          int wRef;
          bool wIfReprod;
          char wType;
          Herbe* wPos;
                 public:
                        Animal(){
                                 cout<<"Constructeur d'Animal\n";
                                   wAge = 0;
                     wIfDead = false;
                     wRef = refGenerale++;
                     wIfReprod = false;
                     wPos = NULL;
                     }
     
                        virtual ~Animal(){
                                cout<<"Destructeur d'animal\n";
                                 if (wPos != NULL) delete wPos;
     
                      }
     
                        int getAge(){return wAge;}
                        int getSex(){return wSex;}
                        bool getIfDead(){return wIfDead;}
                        int getEnergy(){return wEnergy;}
                        int getRef(){return wRef;}
                        bool getIfReprod(){return wIfReprod;}
                        char getType(){return wType;}
                        int getX(){return wPos->X;}
                        int getY(){return wPos->Y;}
                        int getNbRabbit(){return wPos->nbRabbitMale + wPos->nbRabbitFemelle;}
                        int getNbFox(){return wPos->nbFoxMale + wPos->nbFoxFemelle;}
                        int getHauteurHerbe(){return wPos->hauteurHerbe;}
                        Herbe* getPos(){return wPos;}
     
     
     
                        void vieillir(){wAge = wAge+1;}
                        void setSex(int s){wSex = s;}
                        void setIfDead(bool d){ wIfDead = d;}
                        void setEnergy(int e){ wEnergy = e;}
                        void addEnergy(int e){wEnergy = wEnergy + e;}
                        void subEnergy(int e){wEnergy = wEnergy - e;}
                        void setIfReprod(bool r){wIfReprod = r;}
                        char setType(char c){wType = c;}
                        void setPos(Herbe* h){wPos = h;}
     
     
                        virtual void trySeDeplacer(Monde &) = 0;
                        virtual void trySeReproduire(Faune &) =0;
                        virtual void tryManger(Faune &) =0; 
     
                        };
     
     
    class Lapin:public Animal{
    public:
           Lapin():Animal(){
                            cout<<"Constructeur de Lapin \n";
                    Animal::setType('r');
                    Animal::setEnergy(tabInfo[9]);
                    }
           Lapin(int s):Animal(){
                     Animal::setType('r');
                     Animal::setEnergy(tabInfo[9]);
                     Animal::setSex(s);
                     }
           ~Lapin(){cout<<"Destructeur de Lapin\n";}
     
          void avoirBebeLapin(Faune &f,  int n){
               int i = 0;
               while( i != n){
                                       Lapin* l = new Lapin(rand()%2);
                                       l->setPos(this->getPos());
                                       f.addAnimal(l);
                                       tabRapport[7]++;
                                       i++;
                                       }
               }
     
     
          void trySeDeplacer(Monde &m){} //à définir
     
          void trySeReproduire(Faune &f){} //à définir
     
     
          void tryManger(Faune &f){cout<<"Miam une carotte\n";}//à définir
          };
     
    class Renard:public Animal{
          public:
                 Renard():Animal(){
                                   cout<<"Constructeur de renard \n";
                            Animal::setType('f');
                            Animal::setEnergy(tabInfo[10]);
                            }     
                 Renard(int s):Animal(){
                             Animal::setType('f');
                             Animal::setEnergy(tabInfo[10]);
                             Animal::setSex(s);
                             }
                 ~Renard(){cout<<"Destructeur de Renard\n";}
     
     
                 void avoirBebeRenard(Faune &f,  int n){
               int i = 0;
               while( i != n){
                        Renard* r = new Renard(rand()%2);
                        r->setPos(this->getPos());
                        f.addAnimal(r);
                        tabRapport[8]++;
                        i++;
                      }
          }
     
    void trySeDeplacer(Monde &m){} //à définir
    void trySeReproduire(Faune &f){} //à définir 
    void tryManger(Faune &f){cout<<"miam un lapin\n";}//à définir
    };
     
    #endif // _ANIMAL
    et faune.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #ifndef _FAUNE
    #define _FAUNE
    #include "./Animal.h"
    #include "./Para.h"
    #include <vector>
    #include <iostream>
    using namespace std;
     
    typedef vector<Animal*> VecAnim;
     
    class Animal;
     
    class Faune:private VecAnim{
          public:
            Faune():VecAnim(){cout<<"constructeur de faune\n";}
            ~Faune(){
                     cout<<"Destructeur de faune\n";
                     VecAnim::iterator i;
                     for(int i=0;i<this->getSize();i++)delete this->operator[](i);
                     this->clear();
                    }
            int getSize(){return this->size();}
            void addAnimal(Animal* a)
                 {
                 this->push_back(a);
                 //si lapin
                     if( a->getType() == 'r'){
                         //si male
                         if(a->getSex()== 0) a->getPos()->nbRabbitMale++;
                         //si femelle lapin
                         else a->getPos()->nbRabbitFemelle++;
                         }
                     else{//si renard
                         //si male
                         if(a->getSex()== 0) a->getPos()->nbFoxMale++;
                         //si femelle renard
                         else a->getPos()->nbFoxFemelle++;
                         }
                 }
            void delAnimal(int ref)
                 {
                 int i=0;
                 VecAnim::iterator ite;
                 ite=this->begin();
                 while (i != this->getSize() && this->operator[](i)->getRef() != ref) {
                 i++;ite++;}
                 if( i!=this->getSize())
                     {
                     //si lapin
                     if( this->operator[](i)->getType() == 'r'){
                         //si male
                         if(this->operator[](i)->getSex()== 0) this->operator[](i)->getPos()->nbRabbitMale--;
                         //si femelle lapin
                         else this->operator[](i)->getPos()->nbRabbitFemelle--;
                         }
                     else{//si renard
                         //si male
                         if(this->operator[](i)->getSex()== 0) this->operator[](i)->getPos()->nbFoxMale--;
                         //si femelle renard
                         else this->operator[](i)->getPos()->nbFoxFemelle--;
                         }
     
                     delete this->operator[](i);
                     this->operator[](i)=NULL;
                     this->erase(ite,ite);
                     }
                 }
            Animal* seekAnimal(int ref)
                    {
                     int i=0;
                     while (i != this->getSize() && this->operator[](i)->getRef() != ref) i++;
                     if( i!=this->getSize()) return this->operator[](i);
                     }        
            Animal* & operator[](int i)
                    {
                     return *(begin() + i);
                    }
     
          // verif si la bestiole à fait son temps 
          bool ifDeadAge(int i){
               //si Lapin
               if(this->operator[](i)->getType() == 'r'){
                   if( this->operator[](i)->getAge()> tabInfo[1]) return true;
                   }
               else{// si Renard
                    if( this->operator[](i)->getAge()> tabInfo[2]) return true;
                    }
                    return false; 
               }
     
          // fin de tour : mettre reprod a false , vieillir, mourir les vieux,
     
          void finDeTour(){
               int i;
               for( i=0;i != this->getSize();i++){
                    this->operator[](i)->vieillir();
                    if( ifDeadAge(i)) this->delAnimal(this->operator[](i)->getRef());
                    if(this->operator[](i)->getSex() == 1 && this->operator[](i)->getIfReprod() == true)
                          this->operator[](i)->setIfReprod(false); 
                          }
                    }
     
     
    };
     
     
     
    #endif //_FAUNE
    voila je pensais pourtant que ça aller passer , enfin je maitrise bien mal tout ce qui est inclusion !
    Si quelqu'un à une solution ou indication merci d'avance !!

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Le problème c'est que tu veux définir tout ton code dans tes .h. Si tu mets ton code dans des .cpp, tu pourras inclure le .h de faune dedans aussi et tu n'auras pas de problèmes.

    Si réellement tu as besoin de fonctions inline (mais sincèrement l'effet de mettre inline des fonctions qui font de l'allocation dynamique ne doit pas être très grand), tu ne les mets pas dans le corps de la classe mais après, et entre les deux tu inclus aussi les entêtes contenant les définitions dont les fonctions inlines ont besoin. Tu peux même les mettre dans un fichier séparé (mais inclus dans l'entête).

    Personnellement j'utilise .hpp comme extension pour les entêtes C++ (je réserver .h pour les entêtes C), j'ai des .tpp contenant les définitions du code template (inclus conditionnellement dans le .hpp correspondant aussi, conditionnellement parce que j'ai un système me permettant d'utiliser export) et .ipp contenant les inlines (inclus dans le .hpp correspondant, les templates inlines sont dans le .ipp).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    merci , j'ai mis les deux méthodes problématique dans un .cpp en incluant le .h et ça passe c'est bien cool

    vraiment merci à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de forward declaration
    Par crazycrow dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2009, 10h21
  2. Probleme de forward declaration
    Par vandamme dans le forum C++
    Réponses: 10
    Dernier message: 09/10/2007, 19h10
  3. Probleme de forward declaration
    Par vandamme dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 05/10/2007, 18h16
  4. [struts]probleme de forward
    Par VincentP dans le forum Struts 1
    Réponses: 4
    Dernier message: 15/09/2005, 14h42
  5. Réponses: 5
    Dernier message: 10/11/2004, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo