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 :
Je pense donc que j'ai mal effectué mon inclusion, mais je commence à perdre pied, vous avez une idée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part base.cpp:(.text+0xac): undefined reference to `perso::perso()'
Ci dessous le début du code de perso.cpp et perso.hpp et lieu.hpp et lieu.cpp :
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
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
perso.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 // 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
lieu.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() { } ...
base.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; } ...
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
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; } //---------------------------------------------------------------------------
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= .
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
Ça vient peut être de ma compilation ? Je fais ça :
Merci d'avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part g++ -o rpg base.cpp
Partager