[C++]Problème d'utilisation de classe
Résolu/Fermé
DrazX
-
15 déc. 2008 à 17:05
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 18 déc. 2008 à 10:01
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 18 déc. 2008 à 10:01
A voir également:
- [C++]Problème d'utilisation de classe
- Notice d'utilisation - Guide
- Utilisation chromecast - Guide
- Retrouver photo de classe gratuitement ✓ - Forum Loisirs / Divertissements
- Dossier en cours d'utilisation - Forum Windows 8 / 8.1
- Désolé l'utilisation de la base de données a expiré epic games - Forum Jeux vidéo
7 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 déc. 2008 à 09:08
17 déc. 2008 à 09:08
Je me doutai que c'était un problème de compilation, que tu oubliait de lier.
La commande pour l'édition des liens, c'est en gros :
g++ Liste_des_objets option -o nom_executable
dans ton cas, quelques choses comme ça :
g++ -o prog main.o Copy.o -lGTK...
remarque, il ne sert à rien d'indiquer les lib à la compilation.
Ce que je ne comprend pas c'est pourquoi il merde lorsque tu ne met pas le booléen. Peut être vaut il mieux mettre la valeur par défaut dans la déclaration avec la classe.
La commande pour l'édition des liens, c'est en gros :
g++ Liste_des_objets option -o nom_executable
dans ton cas, quelques choses comme ça :
g++ -o prog main.o Copy.o -lGTK...
remarque, il ne sert à rien d'indiquer les lib à la compilation.
Ce que je ne comprend pas c'est pourquoi il merde lorsque tu ne met pas le booléen. Peut être vaut il mieux mettre la valeur par défaut dans la déclaration avec la classe.
Il est normal que la simple déclaration "Copy *copie;" ne provoque pas d'erreur puisqu'il n'est pas fait appel au constructeur; ce qui signifie que l'erreur se passe sans doute dans le constructeur.
Le constructeur de Copy fait appel au constructeur de FileObj, 2 solutions:
1) ne pas faire appel à FileObj, si l'erreur disparait -> voir au niveau du constructeur de FileObj
2) si cela est possible, essayer de construire, dans le main, un objet de la classe FileObj
Le constructeur de Copy fait appel au constructeur de FileObj, 2 solutions:
1) ne pas faire appel à FileObj, si l'erreur disparait -> voir au niveau du constructeur de FileObj
2) si cela est possible, essayer de construire, dans le main, un objet de la classe FileObj
Je me disais la même chose mais j'ai essayé de tout mettre en commentaire dans le constructeur de Copy et ça me donne la même erreur.
Puis dans toutes les methodes et sur les arguments ayant un rapport avec cette classe, même les includes, mais c'est la même chose.
De plus utiliser les méthodes de Copy rajoute les mêmes erreurs sur la methode utilisée:
main.cpp:476: erreur: no matching function for call to «Copy::Copy(const char*&, const char*&)»
ClassCopy.hpp:8: note: candidats sont: Copy::Copy(const char*, const char*, bool)
ClassCopy.hpp:5: note: Copy::Copy(const Copy&)
main.cpp:477: erreur: no matching function for call to «Copy::start()»
ClassCopy.hpp:9: note: candidats sont: void Copy::start(bool)
l'erreur qui m'intrigue c'est le "ClassCopy.hpp:5: note: Copy::Copy(const Copy&)"
dans le code ça correspond à ça dans le header de ma Class Copy:
Puis dans toutes les methodes et sur les arguments ayant un rapport avec cette classe, même les includes, mais c'est la même chose.
De plus utiliser les méthodes de Copy rajoute les mêmes erreurs sur la methode utilisée:
main.cpp:476: erreur: no matching function for call to «Copy::Copy(const char*&, const char*&)»
ClassCopy.hpp:8: note: candidats sont: Copy::Copy(const char*, const char*, bool)
ClassCopy.hpp:5: note: Copy::Copy(const Copy&)
main.cpp:477: erreur: no matching function for call to «Copy::start()»
ClassCopy.hpp:9: note: candidats sont: void Copy::start(bool)
l'erreur qui m'intrigue c'est le "ClassCopy.hpp:5: note: Copy::Copy(const Copy&)"
dans le code ça correspond à ça dans le header de ma Class Copy:
#ifndef DEF_CLASSCOPY #define DEF_CLASSCOPY class Copy { //ligne 5 public: Copy(const char *source, const char *target, bool preserveAttr); //construct void start(bool mode); //method who copy the file (and close two files) int getStat(); ~Copy(); //destruct private: /*FileObj::FileObj *source; FileObj::FileObj *target;*/ int sourceSize; int stat; }; #endif
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
>
DrazX
16 déc. 2008 à 04:31
16 déc. 2008 à 04:31
Bonsoir,
Quand tu écris :
tu ne fais pas appel à ton constructeur, car il a trois paramètres :
Et ce, même si le troisième est facultatif.
Il ne reste donc comme possibilité que le constructeur implicite de copie :
D'où le message d'erreur :
cannot convert «const char*» to «Copy*» in initialization
Quand tu écris :
Copy copie(test,test);
tu ne fais pas appel à ton constructeur, car il a trois paramètres :
Copy::Copy(const char *pth_source, const char *pth_target, bool preserveAttr = false)
Et ce, même si le troisième est facultatif.
Il ne reste donc comme possibilité que le constructeur implicite de copie :
Copy::Copy(const Copy&);
D'où le message d'erreur :
cannot convert «const char*» to «Copy*» in initialization
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
16 déc. 2008 à 08:56
16 déc. 2008 à 08:56
Houlà, les mecs, vous faites du hors sujet.
Souvent, les messages des compilateurs sont les plus parlant. Dans le premier message :
Message suivant.
Comme pour start, le compilo te dit qu'il ne trouve pas la fonction start(void) mais start(bool), ça te permet de corriger ton appel de fonction.
Je ne suis pas daccord avec Droopy sur le constructeur, si le troisième a une valeur par défaut c'est bien pour appeler le constructeur en en omettant un. Il faut juste faire attention à ne pas créer d'ambiguité par exemple Classe(int i,bool j=true) et Classe(int i) lors d'un appel à Classe(3) le compilateur ne sais pas quel constructeur appeler.
Sinon, pour moi le message du compilateur n'a rien à voir avec le code source. Aurait tu oublié une accolade dans un entête ?
Souvent, les messages des compilateurs sont les plus parlant. Dans le premier message :
main.cpp: In function «void copier(GtkWidget*, void*)»: main.cpp:12: erreur: initializer liste d'expressions traitée comme une expression composée main.cpp:12: erreur: cannot convert «const char*» to «Copy*» in initializationIl dit que l'erreur vient de la fonction copier(), or je ne la voi pas dans le code source fourni.
Message suivant.
main.cpp:476: erreur: no matching function for call to «Copy::Copy(const char*&, const char*&)» ClassCopy.hpp:8: note: candidats sont: Copy::Copy(const char*, const char*, bool) ClassCopy.hpp:5: note: Copy::Copy(const Copy&) main.cpp:477: erreur: no matching function for call to «Copy::start()» ClassCopy.hpp:9: note: candidats sont: void Copy::start(bool)le "note:" te liste juste les constructeurs qu'il pourrai utiliser en te disant qu'il ne sont pas bon. Il trouve juste ton constructeur et le constructeur de copie par défaut.
Comme pour start, le compilo te dit qu'il ne trouve pas la fonction start(void) mais start(bool), ça te permet de corriger ton appel de fonction.
Je ne suis pas daccord avec Droopy sur le constructeur, si le troisième a une valeur par défaut c'est bien pour appeler le constructeur en en omettant un. Il faut juste faire attention à ne pas créer d'ambiguité par exemple Classe(int i,bool j=true) et Classe(int i) lors d'un appel à Classe(3) le compilateur ne sais pas quel constructeur appeler.
Sinon, pour moi le message du compilateur n'a rien à voir avec le code source. Aurait tu oublié une accolade dans un entête ?
drazx974
Messages postés
48
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
13 octobre 2009
8
16 déc. 2008 à 11:25
16 déc. 2008 à 11:25
"Sinon, pour moi le message du compilateur n'a rien à voir avec le code source"
non j'ai raccourcis le code à l'essentiel autrement il aurais été beaucoup trop long.
"Aurait tu oublié une accolade dans un entête ? "
Et non je n'ai rien oublié de fermer puisque sans cette ligne qui me pose problème ça se compile très bien.
"Il dit que l'erreur vient de la fonction copier(), or je ne la voit pas dans le code source fourni. "
Il n'y a pas de fonction copier c'est ma déclaration d'objet ça aurait pu être Copy maCopieDeTest("blabla", "blabla", true)
"Il faut juste faire attention à ne pas créer d'ambiguité par exemple Classe(int i,bool j=true) et Classe(int i) lors d'un appel à Classe(3) le compilateur ne sais pas quel constructeur appeler."
Je n'ai fais de surcharge de methode donc je ne vois pas pourquoi il ne trouve rien.
Par contre en mettant le boolean manquant j'obtiens une erreur différente :
Compilation échouée. /tmp/cctqIvpY.o: In function `copier(_GtkWidget*, void*)': main.cpp:(.text+0x86): undefined reference to `Copy::Copy(char const*, char const*, bool)' main.cpp:(.text+0x91): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution
PS:Mon pseudo a changer car je me suis inscrit
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
16 déc. 2008 à 12:40
16 déc. 2008 à 12:40
Certes, le code source aurait été trop long, mais le compilateur indique une erreur dans la fonction "copier(GTK...)" que nous ne voyons pas, pourquoi une erreur dans cette fonction si tu es dans le main() ? L'expérience m'a appris qu'il vaut mieux traité en premier la première erreur du compilateur. il faut se concentrer sur cette fonction "copier()" d'où vient elle, à quoi sert elle ?
Pour tout dire c'est pas clair, le compilo parle de le fonction copier et toi tu nous dit qu'elle n'y ait pas !
Le compilateur a toujours raison, il voit une fonction copier() c'est quelle existe.
Comme c'est l'édition des liens qui merde, regarde les noms présents dans le .o avec nm.exe.
donne nous aussi ta ligne de compilation, ça peux aussi venir de là.
Pour tout dire c'est pas clair, le compilo parle de le fonction copier et toi tu nous dit qu'elle n'y ait pas !
Le compilateur a toujours raison, il voit une fonction copier() c'est quelle existe.
Comme c'est l'édition des liens qui merde, regarde les noms présents dans le .o avec nm.exe.
donne nous aussi ta ligne de compilation, ça peux aussi venir de là.
drazx974
Messages postés
48
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
13 octobre 2009
8
16 déc. 2008 à 18:21
16 déc. 2008 à 18:21
désolé je pensais que tu parlais de la classe. Non en fait la fonction copier() c'est le code main que j'ai copier/coller au départ c'était juste pour faire court et éclaircir les code, mais ça ne change rien.
voilà le code que j'ai raccourcis:
L'erreur est la même que précédement avec le true en 3e argument c'est à dire:
et sans le true:
Mais rassurez-moi c'est bien la syntaxe qu'il faut normalement utiliser pour utiliser un constructeur dans une fonction non ?
voilà le code que j'ai raccourcis:
#include <iostream> #include "ClassCopy.hpp" //#include "ClassFileObj.hpp" using namespace std; int main(int argc, char *argv[]) { const char* test; test = "blabla"; Copy copie(test, test, true); return 0; }
L'erreur est la même que précédement avec le true en 3e argument c'est à dire:
/tmp/cc8OFDFD.o: In function `main': test.cpp:(.text+0x1b2): undefined reference to `Copy::Copy(char const*, char const*, bool)' test.cpp:(.text+0x1c2): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution Compilation échouée.
et sans le true:
test.cpp: In function «int main(int, char**)»: test.cpp:12: erreur: no matching function for call to «Copy::Copy(const char*&, const char*&)» ClassCopy.hpp:8: note: candidats sont: Copy::Copy(const char*, const char*, bool) ClassCopy.hpp:5: note: Copy::Copy(const Copy&) Compilation échouée.
Mais rassurez-moi c'est bien la syntaxe qu'il faut normalement utiliser pour utiliser un constructeur dans une fonction non ?
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
>
drazx974
Messages postés
48
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
13 octobre 2009
16 déc. 2008 à 18:59
16 déc. 2008 à 18:59
A mon avis, ton erreur ne vient effectivement pas de ça, mais tu as une erreur à la compilation qui dit que :
Il semble que tu n'inclues pas l'objet Copy. il ne suffit pas de mettre le .hpp, il faut aussi que le linker (ld) ait à sa disposition les deux objets main.o et ClassCopy.o (ou les nom que tu leurs a donnés)
Je sais pas quel environnement tu utilises... Mais il faut lui dire que ClassCopy.cpp fait partie du projet.
/tmp/cc8OFDFD.o: In function `main': test.cpp:(.text+0x1b2): undefined reference to `Copy::Copy(char const*, char const*, bool)' test.cpp:(.text+0x1c2): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution Compilation échouée.
Il semble que tu n'inclues pas l'objet Copy. il ne suffit pas de mettre le .hpp, il faut aussi que le linker (ld) ait à sa disposition les deux objets main.o et ClassCopy.o (ou les nom que tu leurs a donnés)
Je sais pas quel environnement tu utilises... Mais il faut lui dire que ClassCopy.cpp fait partie du projet.
drazx974
Messages postés
48
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
13 octobre 2009
8
16 déc. 2008 à 19:34
16 déc. 2008 à 19:34
effectivement je n'avais pas pensé à ça. donc après essais :
cas de la compilation avec le booléen:
cas de la construction avec le booléen:
Et sans le booléen rien a changé.
Voila mes ligne de compilation et construction peut-être que ça viens de là (il y a du GTK dans le code complet)
compilation :
construction :
%f nom du fichier avec extension
%e nom du fichier sans extension
cas de la compilation avec le booléen:
g++: -lgtk-x11-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgdk-x11-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -latk-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgdk_pixbuf-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lm: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lpangocairo-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lpango-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lcairo: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgobject-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgmodule-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -ldl: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lglib-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite Compilation terminée avec succès.
cas de la construction avec le booléen:
/tmp/cc4GT3Jz.o: In function `main': test.cpp:(.text+0x1b2): undefined reference to `Copy::Copy(char const*, char const*, bool)' test.cpp:(.text+0x1c2): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution Compilation échouée.
Et sans le booléen rien a changé.
Voila mes ligne de compilation et construction peut-être que ça viens de là (il y a du GTK dans le code complet)
compilation :
g++ `pkg-config --libs --cflags gtk+-2.0` -c "%f"
construction :
g++ `pkg-config --libs --cflags gtk+-2.0` -o "%e" "%f"
%f nom du fichier avec extension
%e nom du fichier sans extension
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
18 déc. 2008 à 10:01
18 déc. 2008 à 10:01
Moi, je ne comprends pas comment ça pouvait marché sans les .o. Si tu ne lui fourni pas l'implémentation des constructeurs, il n'y a pas de raison que ça fonctionne.
Pour le booleen, essai comme je t'ai dit de mettre la valeur par dé&faut uniquement dans la déclaration de la classe.
Pour le booleen, essai comme je t'ai dit de mettre la valeur par dé&faut uniquement dans la déclaration de la classe.
18 déc. 2008 à 04:06
g++ -o main main.cpp ClassCopy.o ClassFileObj.o `pkg-config --libs --cflags gtk+-2.0`
Et CA MARCHE !!!!
Par contre je ne comprend pas que le fait d'enlever le booléen me mette une erreur et aussi qu'avant je n'avais pas besoin de mettre les .o mais bon si ça fonctionne c'est déjà beaucoup.
Pour info mon programe est un clone de SuperCopier pour linux je vais bientôt faire un site du projet qui d'ailleurs est en fait un projet pour mon BTS si j'atteint tout mes obejctifs je pourrais même le présenter comme soutenance de projet.
Merci beaucoup.