[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
Bonjour,
J'ai un soucis qui me prend la tête depuis quelques temps.
En fait je n'arrive pas à utiliser ma classe "Copy"

Mon main.cpp:
#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);
	
	return 0;
}



Ma classe Copy:
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "ClassCopy.hpp"

using namespace std;
//construct
Copy::Copy(const char *pth_source, const char *pth_target, bool preserveAttr = false)
{
	source 	= new FileObj(pth_source); //FileObj est une autre classe
	target 	= new FileObj(pth_target);
	preserve = preserveAttr;
}


Et voila les erreurs obtenus:
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 initialization

Par contre avec le "Copy copie(test,test);" tranformer en "Copy *copie;" sans rien d'autre ça focntionne. Mais si j'ajoute juste après "copie = new Copy(test, test);" pour donner mes arguments j'obtiens l'erreur de départ.

Aidez-moi s'il vous plaît.

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
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.
1
drazx974 Messages postés 48 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 13 octobre 2009 8
18 déc. 2008 à 04:06
J'ai fait:
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.
0
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
0
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:
#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
0
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
Bonsoir,

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
0
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
Houlà, les mecs, vous faites du hors sujet.
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 initialization
Il 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 ?
0
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

"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
0

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
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à.
0
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
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:
#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 ?
0
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
A mon avis, ton erreur ne vient effectivement pas de ça, mais tu as une erreur à la compilation qui dit que :
/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.
0
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
effectivement je n'avais pas pensé à ça. donc après essais :

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
0
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
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.
0