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: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.hppCode:
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.cppCode:
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.cppCode:
1
2
3
4
5
6
7
8
9
10 #include "perso.hpp" #include "lieu.hpp" //--------------------------------------------------------------------------- perso::perso() { } ...
base.cppCode:
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:
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:
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:g++ -o rpg base.cpp