Probleme fichier .h .cpp compilation c++
Résolu
corleone
-
ajroudi -
ajroudi -
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...
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:
- Probleme fichier .h .cpp compilation c++
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
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.
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.
ton problem est le voila :
quand t'utulise pour entrer une valeur t'utilise le point . tu doi utiliser le
->
quand t'utulise pour entrer une valeur t'utilise le point . tu doi utiliser le
->
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
Merci beaucoup!! Ca fonctionne enfin!!!!
(enfin pour l'instant!)
Bonne fin de journée et encore merci!!!!
(enfin pour l'instant!)
Bonne fin de journée et encore merci!!!!