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 :

Problème d'inclusions cycliques


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème d'inclusions cycliques
    Bonjours à vous !

    Je me trouve confronté à un problème assez gênant lors de la réalisation d'un projet tuteuré. Pour vous resituer dans le contexte, je crois créer des zombies, par conséquent des anciens humains contaminés, et qui appartiennent à un groupe.

    Le problème est qu'un zombie pointe vers un Groupe de zombie déjà instancié, hors un Groupe est crée à partir d'un zombie déjà instancié lui aussi. Du coups si je corrige l'inclusion cyclique dans l'un ( 'Group does not name a type', elle se présente dans l'autre sous la forme de expected ')' before '*' token sur mon constructeur de Group.

    Je vous inclus les fichiers avec en commentaire les opérations que j'ai effectué pour que la seconde erreur apparaîsse.

    Zombie.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
    #ifndef ZOMBIE_H
    #define ZOMBIE_H
    #include "./Human.h" 
    // [Seconde erreur] : #include "./Group.h"
     
    class Zombie : public Human
    {
        public:
            static const unsigned short m_CONTAGION_RADIUS=2;
            Zombie(int id, Coordinate coord);
            ~Zombie();
            /* Permet d'ajouter un humain au nombre de victimes contaminés */
            bool hasContamined();
            /* Permet de récuperer le nombre d'humain contaminés par le zombie */
            unsigned short getContagionAmount();
        protected:
        private:
            unsigned short m_contagionAmount;
            Group* m_groupe;
    };
     
    #endif // ZOMBIE_H
    Zombie.cpp

    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
     
    #include "Zombie.h"
    #include "Group.h" // [Seconde erreur] : Include supprimé
    #include "../FloorData/Coordinate.h"
     
    Zombie::Zombie(int id, Coordinate coord, *Group myGroup) : Human(id, coord), m_group(myGroup), m_contagionAmount(0)
    {
    }
     
    Zombie::~Zombie()
    {
        //dtor
    }
     
    bool Zombie::hasContamined(){}
     
    unsigned short Zombie::getContagionAmount(){}
    Group.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
    #ifndef GROUP_H
    #define GROUP_H
    #include <vector>
    #include "Zombie.h" // [Seconde erreur] : Include supprimé
     
    class Group
    {
        public:
            Group(Zombie* aZombie);
     
            /* Permet de récuperer la liste des groupes instanciés lors de la partie */
            static std::vector<Group*> getGroupList();
            /*  Permet d'ajouter un zombie au groupe ciblé
            *   Param : Le nouveau zombie à ajouter*/
            bool addZombie(Zombie* newZombie);
            /*  Permet de supprimer le zombie en question du groupe *
            *   Param : Le zombie à supprimer */
            bool delZombie(Zombie* aZombie);
            /*  Permet de récuperer la liste des zombies appartenant au groupe ciblé */
            std::vector<Zombie*> getZombieList();
            /*  Permet de récuperer le nombre total de zombies appartenant au groupe ciblé */
            int size();
     
        protected:
        private:
            static std::vector<Group*> GROUP_LIST;
            std::vector<Zombie*> zombiesList;
    };
     
    #endif // GROUP_H
    Group.cpp

    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
     
    #include "Group.h"
     // [Seconde erreur] : #include "Zombie.h"
    #include <vector>
     
    using namespace std;
     
    vector<Group*> Group::getGroupList{}
     
    Group::Group(Zombie* aZombie)
    {
    }
     
    bool Group::addZombie(Zombie *newZombie){}
     
    bool Group::delZombie(Zombie *newZombie){}
     
    vector<Zombie*> Group::getZombieList(){}
     
    int Group::size(){}

    Je sais pas si j'ai réeussi à être clair... Mais j'espère que vous pourrez m'aider !

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    FAQ C++: forward declaration et référence cyclique


    Le lien

    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Si tu regardes le code, j'utilise dans le second cas des déclarations anticipées, comme stipulé dans la FAQ que tu viens de m'envoyer....

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Où?
    J'ai beau chercher, je ne vios pas plus que Davidbrcz de déclaration anticipée...
    Précisément, je ne vois pas la ligne:
    dans Group.h
    ...

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Non, tu ne mets pas en oeuvre ce qu'il y dans la FAQ (+1 avec le message au dessus de moi).

    De ce que je vois:
    Zombie dérive de Human. Un include human.h est obligatoire dans Zombie.h
    Zombie dispose aussi dun pointeur sur un groupe. Une forward declaration class Group; suffit pour cet aspect.

    Group dispose de pointeur vers des Zombies. Une FW class Zombie; au début de Group.h suffit
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai ajouté le class zombie; et ça fonctionne maintenant.

    Je vous remercie pour vos réponses !

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Dreimus Voir le message
    J'ai ajouté le class zombie; et ça fonctionne maintenant.

    Je vous remercie pour vos réponses !
    C'est bien, c'est ce qu'il fallait faire...

    Mais as tu au moins compris pourquoi il fallait le faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Il fallait le faire pour pré-charger la pile d'entête, afin que les includes du Group soit anticipés lors de la création du Zombie.

    Non ?

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Précisément:

    1. si les headers s'incluent mutuellement, on a une boucle d'includes donc ça ne marche pas
    2. la pré-déclaration permet de simplement signaler au compilateur que la classe existe, ce qui suffit tant qu'on n'utilise pas les membres dans le header, donc c'est comme ça que le problème se résoud.

    D'une façon générale il faut inclure le moins de headers possibles car ainsi on réduit le couplage entre les fichiers ce qui:
    1. permet de faire évoluer le code avec moins d'impact
    2. permet d'éviter de recompiler inutilement des fichiers qui ne sont pas impactés par les changements effectués

    Tant qu'on ne fait que stocker ou transmettre un pointeur ou une référence dans un fichier la pré-déclaration suffit, donc il vaut mieux s'en contenter

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

Discussions similaires

  1. problème inclusion cyclique
    Par marion5515 dans le forum Débuter
    Réponses: 7
    Dernier message: 20/05/2009, 13h53
  2. Réponses: 2
    Dernier message: 25/04/2006, 17h08
  3. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 03/10/2005, 23h59
  4. Problème d'inclusion de pages.
    Par julien85 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 01/05/2005, 18h06
  5. Problème d'inclusion
    Par degreste dans le forum MFC
    Réponses: 5
    Dernier message: 27/01/2004, 00h56

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