Probleme fichier .h .cpp compilation c++

Résolu/Fermé
corleone - 9 janv. 2008 à 14:19
 ajroudi - 1 oct. 2010 à 17:03
Bonjour,
Je dois écrire un programme en c++ et je rencontre un probleme lors de la compilation avec dev c++ (même problème avec borland c++5.5):

Compilateur: Default compiler
Execution de g++.exe...
g++.exe "C:\Users\****\Desktop\Pro\mainResto.cpp" -o "C:\Users\****\Desktop\Pro\mainResto.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -I"C:\Users\****\Desktop\Pro" -L"C:\Dev-Cpp\lib"
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x290):mainResto.cpp: undefined reference to `client::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x2c7):mainResto.cpp: undefined reference to `client::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x3a4):mainResto.cpp: undefined reference to `client::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x40c):mainResto.cpp: undefined reference to `sportif::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x443):mainResto.cpp: undefined reference to `sportif::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x520):mainResto.cpp: undefined reference to `sportif::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x59a):mainResto.cpp: undefined reference to `habitue::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x5d1):mainResto.cpp: undefined reference to `client::mange(int)'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text+0x757):mainResto.cpp: undefined reference to `habitue::affiche()'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientD1Ev[client::~client()]+0xb):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7sportifD1Ev[sportif::~sportif()]+0xb):mainResto.cpp: undefined reference to `vtable for sportif'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientD2Ev[client::~client()]+0xb):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7habitueD1Ev[habitue::~habitue()]+0xb):mainResto.cpp: undefined reference to `vtable for habitue'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7habitueC1Edi[habitue::habitue(double, int)]+0x101):mainResto.cpp: undefined reference to `vtable for habitue'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientC2EdSs[client::client(double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xe):mainResto.cpp: undefined reference to `vtable for client'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN7sportifC1Ev[sportif::sportif()]+0x104):mainResto.cpp: undefined reference to `vtable for sportif'
C:\Users\****-\AppData\Local\Temp/ccQnaaaa.o(.text$_ZN6clientC1EdSs[client::client(double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xe):mainResto.cpp: undefined reference to `vtable for client'
collect2: ld returned 1 exit status

Execution terminee

Si je place toutes les fonctions présentes des .cpp dans les .h, alors ça fonctionne parfaitement. Mais je dois absolument rendre mon projet avec des .cpp et des .h séparés.
voici les differents fichiers:


//mainresto.cpp

#include <cstdio>
#include "client.h"
#include "habitue.h"
#include "sportif.h"
#include <string>
#include <iostream>


using namespace std;

int main()
{

cout <<"nouveau client\n"<<endl;
client cl1;// creation d'un nouveau client
cl1.affiche(); // affichage des attributs du nouveau client (nom et nb de calories, par defaut)
cout <<"\n"<<endl;
cl1.mange(150);
cl1.changeNom("Mr machin");
cl1.affiche();
cout <<"\n"<<endl;
cout <<"nouveau sportif\n"<<endl;
sportif cl2;
cl2.affiche();
cout <<"\n"<<endl;
cl2.mange(500);
cl2.changeNom("Mr Chose");
cl2.affiche();
cout <<"\n"<<endl;
cout <<"nouvel habitue\n"<<endl;
habitue cl3;
cl3.affiche();
cout <<"\n"<<endl;
cl3.mange(200);
cl3.changeNom("Mme Truc");
cl3.affiche();

// client.cpp

#include "client.h"
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void client::affiche() {
cout << "nom : " << nom <<"\n Calories ingurgitees : " << nbCalAccu << endl;
}

double client::mange (int qttNour){
nbCalAccu += qttNour;
return nbCalAccu;
}


//client.h

#ifndef CLIENT_H
#define CLIENT_H
#include <string>
#include <iostream>
#include <ctime>

using namespace std;

class client{ public:
string nom;
double nbCalAccu;
client(double calo=3000 , string nm ="monsieur X") : nbCalAccu(calo) , nom(nm) {};
void changeNom(string nvnom){
nom = nvnom;
return;
}
virtual void affiche() ;
virtual double mange (int qttNour);
};

#endif

//habitue.cpp
#include "client.h"
#include "habitue.h"
#include <string>
#include <cstdio>
#include <iostream>

using namespace std;

void habitue::affiche(){
client :: affiche();
cout << "anciennete : " << annees <<" ans" << endl;
}


//habitue.h

#ifndef HABITUE_H
#define HABITUE_H
#include <string>
#include <ctime>

using namespace std;

class habitue : public client { public:
int annees;
//double nbCalAccu;
habitue (double calo = 5000 , int ans = 3) : client(calo), annees(ans) {};
void affiche();
};

#endif

Désolé pour le message très long mais je préfère vous donner tout le code (même si je n'ai pas mis les fichiers "sportifs" qui sont construits exactement comme "habitue").

Merci d'avance de vos réponses. J'espère que vous pourrez m'aider, ça fait 4 jours que je bloque là dessus...
A voir également:

7 réponses

Bonjour

Je m'en tiens au premier message d'erreurs, la plupart des autres ont l'air d'être dus au même problème

dans mainresto.cpp, tu utilises la méthode affiche de la classe client, mais cette méthode n'est déclarée nulle part . Elle n'apparaît pas dans client.h
il FAUT la définir, ou au moins la déclarer, dans client.h, le compilateur n'a pas les moyens de la deviner.
1
ton problem est le voila :
quand t'utulise pour entrer une valeur t'utilise le point . tu doi utiliser le
->
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 janv. 2008 à 14:57
affiche est bien déclarer dans client.h.
J'ai plutôt l'impression que tu a oublié de compiler TOUT les .cpp avant de faire le lien.
Avec DevCpp, quand tu as plusieurs fichier sources (.cpp) il faut créer un projet pour compiler correctement.
0
Désolé. Je ferais mieux de faire la sieste...
0
merci pour vos réponses.
le problème est que j'ai fait un projet avant de compiler sous dev c++. Et avant ça, j'avais essayé de compiler avec borland c++, en compilant chaque cpp... mais toujours ces erreurs...
au cas où j'ai mal fait la manip sous dev c++, peux-tu m'expliquer en détails la démarche?
Merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 janv. 2008 à 15:37
Dans DevCpp tu crée un projet, puis tu ajoute tout te fichiers source. Et normalement ça fonctionne.
Le mieux est peux être de le faire à la main, tu commence par créer les fichier object :
g++ -c *.cpp I...
une foi que tout tes .cpp sont transformer en .o tu les lie ensemble
g++ *.o -o prog.exe -L... etc.
0
Merci beaucoup!! Ca fonctionne enfin!!!!
(enfin pour l'instant!)
Bonne fin de journée et encore merci!!!!
0
tchoubaka Messages postés 61 Date d'inscription samedi 7 février 2009 Statut Membre Dernière intervention 25 mai 2023 11
6 déc. 2009 à 11:54
salut Corleone, j'aimerais que tu m'explique le but de ton programme. j'aimerias bien comprendre malgre qu'il soit deja resolu. j'aimerias aussi savoir si tu utilise les fichiers .h s'il te plait je veux juste comprendre.
merci.
0