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 :

#include cyclique ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut #include cyclique ?
    Bonjour,

    Je suis en train de développer un RPG en C++ et je me heurte à un problème.
    Je vous donne un extrait des fichiers concernés :

    Monstre.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
    #ifndef _Monstre_
    #define _Monstre_
     
    #include "Personnage.h"
     
    using namespace std;
     
    class Monstre
     
    {
       private:
       ...
     
       public :
       ...
       void Attaquer(Personnage &cible); // 'Personnage' has not been declared
       ...
     
    };
     
    #endif

    Personnage.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
    #ifndef _Personnage_
    #define _Personnage_
     
    #include "Monstre"
     
    class Personnage
    {
       protected:
       ...
     
       public:
       ...
       void Attaquer(Monstre &cible); // Pas d'erreur
       ...
    };
     
    #endif

    Notons que je si je mets en commentaire #include "Monstre.h" et "void Attaquer(Monstre &cible)" dans Personnage.h, alors il n'y a plus d'erreur dans mon "Monstre.h" .

    Pour résoudre mon problème, je pourrais faire passer ma classe "Monstre" en tant que héritage de la classe personnage, mais je ne veux pas, je veux créer une classe "Monstre" à part entière.

    Merci.

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Le problème c'est que il y as forcement un de tes deux fichiers qui sera inclus avant l'autre. La class décrite dans ce fichier ne connaitra donc pas l'autre class, et ne pourra donc être compilée.

    La solution la plus simple est d'ajouter un petit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Personnage; //Ne pas oublier le point virgule
    Avant ta class Monstre.
    Si le compilateur n'as pas besoin d'en savoir plus sur ta class Personnage(ce qui sera la cas si tu met bien tes corps de fonction dans le cpp, et si tu passe tes Personnage par référence), ça compilera.

    Mais une solution qui serai a mon avis plus ingénieuse, serai de faire hériter Monstre et Personnage d'une class de base, qui s'appellerait par exemple Entity. Tu verra qu'ils aurons beaucoup de code en commun, et ça sera très pratique.
    Ainsi ta méthode d'attaque pourrai ressembler a ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Entity::Attaquer(Entity &cible);
    En plus ça te donne plus de liberté, car un montre pourra attaquer un autre monstre, et un personnage un autre personnage.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Merci de ta réponse.

    C'est très généreux de ta part d'avoir pris le temps de comprendre mon problème et de m'avoir donné une réponse claire et précise.

    Grâce à toi, mon projet va pouvoir avancer de plus belle

    Je te souhaite une bonne journée et encore merci.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Une bonne manière de faire est de ne jamais faire d'include dans un header, avant que le compilateur ne râle....

    Bien sur faire toutes les déclarations (enum, struct et classes) utilisées avant... et si le compilateur demande une définition, alors faire l'include.

    Ca permet aussi de gagner en temps de compilation (en particulier incrémentale)

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Une bonne manière de faire est de ne jamais faire d'include dans un header, avant que le compilateur ne râle....

    Bien sur faire toutes les déclarations (enum, struct et classes) utilisées avant... et si le compilateur demande une définition, alors faire l'include.

    Ca permet aussi de gagner en temps de compilation (en particulier incrémentale)
    Et quand on commence à avoir des dépendances en spaghettis, se poser de sérieuses questions sur sa conception.

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

Discussions similaires

  1. Problèmes de #include cycliques
    Par alpha35 dans le forum Débuter
    Réponses: 2
    Dernier message: 19/12/2009, 16h18
  2. include cyclique : problème
    Par casafa dans le forum C++
    Réponses: 8
    Dernier message: 07/07/2007, 17h53
  3. include
    Par ronald dans le forum ASP
    Réponses: 11
    Dernier message: 06/11/2003, 14h30
  4. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44
  5. #include "math.h" et #include <math.h>
    Par pounka dans le forum C
    Réponses: 4
    Dernier message: 01/05/2003, 21h06

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