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

Langage C++ Discussion :

Inclusion de class, declaration anticipée, problème de compilation


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Inclusion de class, declaration anticipée, problème de compilation
    Bonsoir à tous, je suis en seconde année de BTS IRIS et pour passer le temps je me suis lancé dans la réalisation d'un jeu de rôle textuel (comme zork par exemple). Je code sous linux avec gedit et gcc.

    Ça avance assez bien, mais je me retrouve face à un problème un peu chiant, j'ai séparé mon programme en 5 fichiers :

    base.cpp (qui contient le main)
    lieu.hpp et lieu.cpp (qui contiennent la class lieu et les fonctions qui s'y rapportent, c'est pour la carte)
    perso.hpp et perso.cpp (qui contiennent la class perso et les fonctions qui vont bien. C'est pour le joueur et les pnj)

    Si je réuni mon prog dans base.cpp la compilation fonctionne correctement, par contre une fois séparés les ennuis commencent.
    En effet, les deux class lieu et perso contiennent une variable du type de l'autre class. Après avoir fait quelques recherches j'ai ajouté une déclaration anticipée de lieu avant perso et une autre de perso avant lieu, mais j'ai un tas de message de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    base.cpp:(.text+0xac): undefined reference to `perso::perso()'
    Je pense donc que j'ai mal effectué mon inclusion, mais je commence à perdre pied, vous avez une idée ?

    Ci dessous le début du code de perso.cpp et perso.hpp et lieu.hpp et lieu.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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // La class perso qui definit un personnage et les fonction associées
     
    #ifndef PERSO_H
    #define PERSO_H
     
    class lieu;  // declaration anticipée
     
    class perso
    {
    private :       int level;
                    float pv, pvmax, force, dex, consti, magie, savoir, sag, charsm, crit, xp;
                    char *classe, *nom;
                    lieu *position; // variable de type lieu dans perso
     
     
    public :        perso();
                    void init(char *, lieu *);
                    void affiche(int);
     
                    lieu *getposition();
                    int interpreteur(char []);
                    void deplacement(int);
     
                    //void intro();
                    void asc(char *);
     
                    void attaque();
                    void combat(perso);
     
                    ~perso();
    };
     
    #endif
    lieu.hpp
    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
     
    // La class d'un lieu et toutes fonctions qui s'y rapportent
     
    #ifndef LIEU_H
    #define LIEU_H
     
    class perso;
     
    class lieu
    {
    private :       char *nom;
                    lieu *nord, *est, *ouest, *sud, *vendeur, *guerisseur, *forgeron;
                    bool piece;
    		perso *taulier;
     
    public  :       lieu();
                    ~lieu();
                    char *getnom();
    		perso *gettaulier();
                    lieu *getpoint(int);
                    bool getpiece();
                    void init(char *, perso *, lieu *, lieu *, lieu *, lieu *, lieu *, lieu *, lieu *, bool);
    };
     
    #endif
    perso.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "perso.hpp"
    #include "lieu.hpp"
     
    //---------------------------------------------------------------------------
     
    perso::perso()
    {
    }
     
    ...
    lieu.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "lieu.hpp"
    #include "perso.hpp"
     
    //---------------------------------------------------------------------------
     
    lieu::lieu()
    {
    taulier=0;
    nord=est=ouest=sud=vendeur=guerisseur=forgeron=0;
    }
     
    ...
    base.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
    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
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
     
    #include "lieu.hpp"
    #include "perso.hpp"
     
    //#include "lieu.cpp"
    //#include "perso.cpp"
     
    //---------------------------------------------------------------------------
     
    int main()
    {
    char chaine[30];
     
    perso joueur;
    perso elendyl;
    perso harbask;
    perso maya;
     
    lieu erendorph;
    lieu erendorph_mage;
    lieu erendorph_forgeron;
    lieu erendorph_vendeur;
     
    lieu foret;
     
    joueur.init("Silk", &erendorph_mage);
    elendyl.init("Elendyl", &erendorph_mage);
    harbask.init("Harbask", &erendorph_forgeron);
    maya.init("Maya", &erendorph_vendeur);
     
    erendorph.init("Erendorph (village)", 0, &foret, 0, 0, 0, &erendorph_vendeur, &erendorph_mage, &erendorph_forgeron, 0);
     
    foret.init("Foret d'Hyurle (Foret)",				   0, 0, 0, 0, &erendorph, 0, 0, 0, 0);
    erendorph_mage.init("Mage d'Erendorph (Maison d'Elendyl)",         &elendyl, &erendorph, 0, 0, 0, 0, 0, 0, 1);
    erendorph_forgeron.init("Forgeron d'Erendorph (Forge de Harbask)", &harbask, &erendorph, 0, 0, 0, 0, 0, 0, 1);
    erendorph_vendeur.init("Marchand d'Erendorph (Marcher de Maya)",   &maya, &erendorph, 0, 0, 0, 0, 0, 0, 1);
     
    //joueur.intro();
     
    for(int i=0;i<2;)
            {
            system("clear");
     
            joueur.affiche(5);
            if(i==1)
                    joueur.affiche(4);
            printf("  > ");
     
            gets(chaine);
     
            i=joueur.interpreteur(chaine);
            }
     
    return 0;
    }
    //---------------------------------------------------------------------------
    Voilà, pour le code. Ci dessous le message d'erreur de g++ :
    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
     
    base.cpp: In function ‘int main()’:
    base.cpp:32:36: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:33:40: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:34:44: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:35:37: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:37:118: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:39:78: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:40:109: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:41:109: attention : deprecated conversion from string constant to ‘char*’
    base.cpp:42:106: attention : deprecated conversion from string constant to ‘char*’
    /tmp/ccf9GweY.o: In function `main':
    base.cpp:(.text+0x371): warning: the `gets' function is dangerous and should not be used.
    base.cpp:(.text+0x18): undefined reference to `perso::perso()'
    base.cpp:(.text+0x27): undefined reference to `perso::perso()'
    base.cpp:(.text+0x33): undefined reference to `perso::perso()'
    base.cpp:(.text+0x3f): undefined reference to `perso::perso()'
    base.cpp:(.text+0x4e): undefined reference to `lieu::lieu()'
    base.cpp:(.text+0x5d): undefined reference to `lieu::lieu()'
    base.cpp:(.text+0x6c): undefined reference to `lieu::lieu()'
    base.cpp:(.text+0x7b): undefined reference to `lieu::lieu()'
    base.cpp:(.text+0x8a): undefined reference to `lieu::lieu()'
    base.cpp:(.text+0xac): undefined reference to `perso::init(char*, lieu*)'
    base.cpp:(.text+0xce): undefined reference to `perso::init(char*, lieu*)'
    base.cpp:(.text+0xed): undefined reference to `perso::init(char*, lieu*)'
    base.cpp:(.text+0x10c): undefined reference to `perso::init(char*, lieu*)'
    base.cpp:(.text+0x177): undefined reference to `lieu::init(char*, perso*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, bool)'
    base.cpp:(.text+0x1d9): undefined reference to `lieu::init(char*, perso*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, bool)'
    base.cpp:(.text+0x23e): undefined reference to `lieu::init(char*, perso*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, bool)'
    base.cpp:(.text+0x2a0): undefined reference to `lieu::init(char*, perso*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, bool)'
    base.cpp:(.text+0x302): undefined reference to `lieu::init(char*, perso*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, lieu*, bool)'
    base.cpp:(.text+0x335): undefined reference to `perso::affiche(int)'
    base.cpp:(.text+0x356): undefined reference to `perso::affiche(int)'
    base.cpp:(.text+0x38b): undefined reference to `perso::interpreteur(char*)'
    base.cpp:(.text+0x3b9): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x3c8): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x3d7): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x3e6): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x3f5): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x401): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x40d): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x41c): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x42b): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x449): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x45c): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x46f): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x482): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x495): undefined reference to `lieu::~lieu()'
    base.cpp:(.text+0x4a5): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x4b5): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x4c8): undefined reference to `perso::~perso()'
    base.cpp:(.text+0x4db): undefined reference to `perso::~perso()'
    collect2: ld a retourné 1 code d'état d'exécution
    J'ai même essayé d'inclure les .cpp pour voir si ça changeait un truc, et effectivement le programme se compile. Mais ça doit pas être la bonne méthode alors j'aimerai savoir comment faire proprement =:3= .

    Ça vient peut être de ma compilation ? Je fais ça :

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    un .cpp ne s'inclut pas, il se compile.
    C'est une erreur de link, il ne trouve pas la fonction, puisque tu ne la compiles pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci à toi Bousk, ça fonctionne avec cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g++ base.cpp lieu.cpp perso.cpp -o rpg
    Je ne suis pas très familier avec la compilation sans IDE, je vais lire un tuto ou deux.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    cela dit, traduis le "warning: the `gets' function is dangerous and should not be used." par "WARNING: NUCLEAR BOMB IS ENGAGED IN THIS SOFTWARE"

    Puisque tu es en C++, utilise string, istream et getline.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Ouais, c'était pour test.
    Depuis je me suis fait une fonction sécurisée pour la saisie.

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

Discussions similaires

  1. [ZF 1.10] Problème inclusion de classe et set_include_path()
    Par Darkstar34 dans le forum MVC
    Réponses: 3
    Dernier message: 27/03/2011, 22h37
  2. Problème de compilation sur des classes
    Par tom31 dans le forum C++
    Réponses: 2
    Dernier message: 31/01/2011, 17h17
  3. Réponses: 5
    Dernier message: 30/08/2010, 18h26
  4. Réponses: 0
    Dernier message: 15/04/2010, 14h00
  5. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28

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