Besoin d'aide C++
Résolu/Fermé
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
-
27 janv. 2009 à 21:34
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 28 janv. 2009 à 16:49
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 28 janv. 2009 à 16:49
13 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
28 janv. 2009 à 15:18
28 janv. 2009 à 15:18
J'y suis !
J'ai fait une partie du programme chez moi, en fait pour l'auteur il faut utiliser l'affectation des membres :
J'ai fait une partie du programme chez moi, en fait pour l'auteur il faut utiliser l'affectation des membres :
Livre::Livre(int numer,char *titr,char *nom,char *prenom,char *pays) :aut(nom,prenom,pays) { numero=numer; titre=new char[strlen(titr)+1]; strcpy(titre,titr); }ou encore plus proprement :
Livre::Livre(int numer,char *titr,char *nom,char *prenom,char *pays) :aut(nom,prenom,pays),numero(numer) { titre=new char[strlen(titr)+1]; strcpy(titre,titr); }Cette méthode s'adapte aussi lorsque le constructeur des classes mères n'est pas directement accessible.
Auteur::Auteur(char *n,char *p,char *pa) { nom=new char [strlen(n)+1]; prenom=new char [strlen(p)+1]; pays=new char [strlen(pa)+1]; strcpy(nom,n); strcpy(prenom,p); strcpy(pays,pa); }
legulysse
Messages postés
121
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
16 janvier 2010
15
27 janv. 2009 à 23:48
27 janv. 2009 à 23:48
Bonjour,
d'après ton exemple, tu as une classe livre, qui contient une variable définissant un auteur, et tu aimerais initialiser le contenu des variables de cet auteur depuis la classe livre.
Si c'est bien ça, la première chose à savoir, c'est que selon le paramètre "public" ou "private", tes variables ne seront pas directement accessibles par tout le monde. après un "public", n'importe qui peut acceder aux variables de ton objet, via un simple :
En général, par sécurité, on préfère les mettre en "private", afin que seule la classe puisse modifier ses propres données, et on cré des méthodes publiques pour y acceder. Tu peux ainsi créer, dans ta classe auteur, une méthode
que ta classe livre pourra appeler depuis l'une de ses fonctions membres, comme son constructeur, via un :
d'après ton exemple, tu as une classe livre, qui contient une variable définissant un auteur, et tu aimerais initialiser le contenu des variables de cet auteur depuis la classe livre.
Si c'est bien ça, la première chose à savoir, c'est que selon le paramètre "public" ou "private", tes variables ne seront pas directement accessibles par tout le monde. après un "public", n'importe qui peut acceder aux variables de ton objet, via un simple :
Auteur aut; aut.nom = " ... ";
En général, par sécurité, on préfère les mettre en "private", afin que seule la classe puisse modifier ses propres données, et on cré des méthodes publiques pour y acceder. Tu peux ainsi créer, dans ta classe auteur, une méthode
DefinirAuteur(char *nom, char *prenom, char *pays );
que ta classe livre pourra appeler depuis l'une de ses fonctions membres, comme son constructeur, via un :
aut.DefinirAuteur( "Tolkien", "J.R.R.", "Angleterre" );
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 12:37
28 janv. 2009 à 12:37
D'abords merci pour votre réponse!
Dans l'enoncé les attributs et les methodes sont donné pour chaque classe, alors je crois que j'ai pas le droit d'ajouté une autre methode. Voila ce que j'ai faits , mais le programme m'affiche pas les donnés de la classe Auteur:
classe Auteur:
Classe livre:
Main:
Cela affiche juste :
Aidez moi SVP.
Dans l'enoncé les attributs et les methodes sont donné pour chaque classe, alors je crois que j'ai pas le droit d'ajouté une autre methode. Voila ce que j'ai faits , mais le programme m'affiche pas les donnés de la classe Auteur:
classe Auteur:
class Auteur{ private: char *nom; char *prenom; char *pays; public: Auteur(char *n="",char *p="",char *pa=""); ~Auteur(); Auteur(const Auteur&); void remplir(); void affichage(); }; Auteur::Auteur(char *n,char *p,char *pa){ nom=new char[strlen(n)+1]; strcpy(nom,n); prenom=new char[strlen(p)+1]; strcpy(prenom,p); pays=new char[strlen(pa)+1]; strcpy(pays,pa); } Auteur::~Auteur(){ if(nom) delete[] nom; if(prenom) delete[] prenom; if(pays) delete[] pays; } Auteur::Auteur(const Auteur &a){ nom=new char[strlen(nom)+1]; nom=a.nom; prenom=new char[strlen(prenom)+1]; prenom=a.prenom; pays=new char[strlen(pays)+1]; pays=a.pays; } void Auteur::remplir(){ cout<<"Entrer votre nom : "; gets(nom); cout<<"Entrer votre prenom : "; gets(prenom); cout<<"Entrer votre pays : "; gets(pays); } void Auteur::affichage(){ cout<<"votre nom est : "<<nom<<endl; cout<<"votre prenom est : "<<prenom<<endl; cout<<"votre pays est : "<<pays<<endl; }
Classe livre:
class Livre{ private: int numero; char *titre; Auteur aut; public: Livre(int num=0,char *t="",char *n="",char *p="",char *pa=""); friend void affichage(Livre&); }; Livre::Livre(int num,char *t,char *n,char *p,char *pa){ Auteur a(n,p,pa); numero=num; titre=new char[strlen(t)+1] ; strcpy(titre,t); } void affichage(Livre &l){ cout<<"num :"<<l.numero<<endl; cout<<"titre :"<<l.titre<<endl; l.aut.affichage(); }
Main:
int main(int argc, char *argv[]) { Livre l(12,"blabla","bli","blo","bla"); affichage(l); system("PAUSE"); return EXIT_SUCCESS; }
Cela affiche juste :
num:12 titre:blabla nom: prenom: pays:
Aidez moi SVP.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
28 janv. 2009 à 12:57
28 janv. 2009 à 12:57
Salut.
c'est normal, tu cré une nouvelle variable auteur mais tu ne mets pas à jours celle de la classe.
Attention aussi aux pointeurs, tu gère à la lègère !
c'est normal, tu cré une nouvelle variable auteur mais tu ne mets pas à jours celle de la classe.
Livre::Livre(int num,char *t,char *n,char *p,char *pa){ aut=Auteur(n,p,pa); numero=num; titre=new char[strlen(t)+1] ; strcpy(titre,t); }
Attention aussi aux pointeurs, tu gère à la lègère !
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 13:02
28 janv. 2009 à 13:02
Avez vous executé cette ligne:
ça me signale une erreur !!
et losque je met :
cela m'affiche des caractere speciaux !
aut=Auteur(n,p,pa);??
ça me signale une erreur !!
et losque je met :
Auteur a(n,p,pa); aut=a; //constructeur de recopie
cela m'affiche des caractere speciaux !
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
4
>
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
28 janv. 2009 à 13:13
28 janv. 2009 à 13:13
Salut,
Tu peut ecrire aut = a si et seulement si tu a fais le surcharge de l'operator = dans la class auteure
Tu peut ecrire aut = a si et seulement si tu a fais le surcharge de l'operator = dans la class auteure
Auteur & operator=(const Auteur & X) { if (*this != &X ) { //affectation de tout les attribue de X a this } return *this; }
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
>
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
28 janv. 2009 à 13:17
28 janv. 2009 à 13:17
Oui justement si on parle de l'affectation, mais ici je veux utiliser le constructeur de recopie, en plus dans ce cas, j'ai pas le droit d'ajouté une autre methode (operator...etc), est ce que vous avez une autre solution ?
Lorsque j'ajoute la methode affichage dans le constructeur ça m'affiche les donnés:
mais pas dans la methode void affichage(Livre &l)
Lorsque j'ajoute la methode affichage dans le constructeur ça m'affiche les donnés:
Livre::Livre(int num,char *t,char *n,char *p,char *pa){ Auteur a(n,p,pa); aut=a; aut.affichage(); numero=num; titre=new char[strlen(t)+1] ; strcpy(titre,t); } void affichage(Livre &l){ cout<<"num :"<<l.numero<<endl; cout<<"titre :"<<l.titre<<endl; l.aut.affichage(); }
mais pas dans la methode void affichage(Livre &l)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
>
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
28 janv. 2009 à 14:06
28 janv. 2009 à 14:06
Salut.
En théorie, certains opérateurs constructeurs se cré par défaut. Il me semble que c'est le cas de la construction sans argument, la destruction, l'opérateur d'affectation, et le constructeur par copie.
En théorie, certains opérateurs constructeurs se cré par défaut. Il me semble que c'est le cas de la construction sans argument, la destruction, l'opérateur d'affectation, et le constructeur par copie.
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
>
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
28 janv. 2009 à 14:15
28 janv. 2009 à 14:15
je suis dans le constructeur de recopie de classe livre:
Livre::Livre(Livre &l){
numero=l.numero;
titre=new char[strlen(l.titre)+1];
strcpy(titre,l.titre);
Auteur a(l.aut.nom,l.aut.prenom,l.aut.pays);
aut=a;
}
mais nom, prenom, auteur sont privé que dois je faire sans passer par les getteur?
Livre::Livre(Livre &l){
numero=l.numero;
titre=new char[strlen(l.titre)+1];
strcpy(titre,l.titre);
Auteur a(l.aut.nom,l.aut.prenom,l.aut.pays);
aut=a;
}
mais nom, prenom, auteur sont privé que dois je faire sans passer par les getteur?
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
4
28 janv. 2009 à 13:25
28 janv. 2009 à 13:25
Bon , ta pa le drois d'ajouter une methode????? c bizar, ce que je c : pour une class bien definie dans c++ 3 chose doivent etre present : le constructeur , le constructeur de copie , le surcharge de l'operateur = , les getteur et les seutteur(optionnel).
si tu n'utulise pa l'operateur =, pour les attribut prive ils te faut des getteur et le setteur pour faire l'affectation un par un des attribut de la class Auteur dans la class Livre....
si tu n'utulise pa l'operateur =, pour les attribut prive ils te faut des getteur et le setteur pour faire l'affectation un par un des attribut de la class Auteur dans la class Livre....
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 13:28
28 janv. 2009 à 13:28
Non , juste je dois respecter l'enoncé, voila j'ai modifié mon poste ci-dessus
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
4
28 janv. 2009 à 13:30
28 janv. 2009 à 13:30
Est ce que tu peut nous écrire l'énoncé????
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 13:35
28 janv. 2009 à 13:35
Soit la classe livre:
Definir les fonction membres de la classe livre.
Voila concernant la classe auteur je l'a deja ecrit ci-dessus. j'ai pas encors défini constructeur de recopi, destr, remplir, compare de la classe livre. Je veux d'abords tester le constructeur et l'affichage. :)
class Livre{ private: int numero; char *titre; Auteur aut; public: Livre(int num=0,char *t="",char *n="",char *p="",char *pa=""); Livre(Livre&); ~Livre(); void remplir(); friend void affichage(Livre&); int compare(Livre &a,int mode); };
Definir les fonction membres de la classe livre.
Voila concernant la classe auteur je l'a deja ecrit ci-dessus. j'ai pas encors défini constructeur de recopi, destr, remplir, compare de la classe livre. Je veux d'abords tester le constructeur et l'affichage. :)
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
4
28 janv. 2009 à 13:41
28 janv. 2009 à 13:41
ce que je comprent est que on te demade de definre les fonction membre de la classe Livre, pas faire tourner le programme qui ne tournera jamais sans un operteur = ou des getteurs et des setteur dans la class Auteur !!
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
>
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
28 janv. 2009 à 13:47
28 janv. 2009 à 13:47
ça c'est un TP d'un examen final que je vais passer aprés qq jours :s . pourquoi qui ne tournera jamais?? En fait le constructeur de recopie marche bien puisqu'il m'affiche le resultat
Livre::Livre(int num,char *t,char *n,char *p,char *pa){
Auteur a(n,p,pa);
aut=a;
aut.affichage()
numero=num;
titre=new char[strlen(t)+1];
strcpy(titre,t);
}
Maintenant c'est pas un probleme d'affectations, mais lorsque j'appele la fonction d'affichage de la classe auteur dans la fonction d'affichage de la classe livre
c'est la qu'il m'affiche pas. Je sais pas ou est le probleme?!
Livre::Livre(int num,char *t,char *n,char *p,char *pa){
Auteur a(n,p,pa);
aut=a;
aut.affichage()
numero=num;
titre=new char[strlen(t)+1];
strcpy(titre,t);
}
Maintenant c'est pas un probleme d'affectations, mais lorsque j'appele la fonction d'affichage de la classe auteur dans la fonction d'affichage de la classe livre
void affichage(Livre &l){ cout<<"num :"<<l.numero<<endl; cout<<"titre :"<<l.titre<<endl; l.aut.affichage(); //n'affiche rien }
c'est la qu'il m'affiche pas. Je sais pas ou est le probleme?!
MRAD
Messages postés
86
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2009
4
>
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
28 janv. 2009 à 13:51
28 janv. 2009 à 13:51
OK, ton probleme et le destructeur de la class auteur, enleve le et vois le resultas....!
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 13:55
28 janv. 2009 à 13:55
ça marche :):):)
p.s. j'ai pas enlevé le destructeur
p.s. j'ai pas enlevé le destructeur
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 14:02
28 janv. 2009 à 14:02
re :)
maintenantt je suis dans le constructeur de recopie de classe livre:
mais nom, prenom, auteur sont privé que dois je faire sans passer par les getteur?
maintenantt je suis dans le constructeur de recopie de classe livre:
Livre::Livre(Livre &l){ numero=l.numero; titre=new char[strlen(l.titre)+1]; strcpy(titre,l.titre); Auteur a(l.aut.nom,l.aut.prenom,l.aut.pays); aut=a; }
mais nom, prenom, auteur sont privé que dois je faire sans passer par les getteur?
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
28 janv. 2009 à 14:16
28 janv. 2009 à 14:16
aut=a, c'est l'opérateur d'affectation.
La copie, c'est :
Auteur aut(a);
ce que tu ne peux pas appeler car tu as déjà déclarer aut.
Quelle erreur est donnée lors de aut=Auteur(n,np,na);? Une erreur avec const ?
J'ai peur aussi que lors de l'exécution, il y ait des erreur de segmentation du au "aut=a".
Si tu fait aut.nom=a.nom, lorsque tu appel le destructeur de "a", tu détruira aussi aut.nom.
Une solution serait de mettre aut en pointeur, ainsi dans le constructeur tu pourrai faire :
aut = new Auteur(a,b,c);
La copie, c'est :
Auteur aut(a);
ce que tu ne peux pas appeler car tu as déjà déclarer aut.
Quelle erreur est donnée lors de aut=Auteur(n,np,na);? Une erreur avec const ?
J'ai peur aussi que lors de l'exécution, il y ait des erreur de segmentation du au "aut=a".
Si tu fait aut.nom=a.nom, lorsque tu appel le destructeur de "a", tu détruira aussi aut.nom.
Une solution serait de mettre aut en pointeur, ainsi dans le constructeur tu pourrai faire :
aut = new Auteur(a,b,c);
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 14:40
28 janv. 2009 à 14:40
Ce programme parfois il m'affiche les infos et parfois non, c'est bizarre!! maintenant lorsque je l'ai reexecuté. rien n'est affiché je sais pas pourquoi, pour le : aut = new Auteur(a,b,c); il m'affiche probleme de const
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 14:50
28 janv. 2009 à 14:50
Lorsque j'ajoute la methode :
il m'affiche pas les donnés precedentes ..
Livre::Livre(Livre &l){ numero=l.numero; titre=new char[strlen(l.titre)+1]; strcpy(titre,l.titre); Auteur a(l.aut); aut=a; }
il m'affiche pas les donnés precedentes ..
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
28 janv. 2009 à 15:08
28 janv. 2009 à 15:08
attention, pour le new, il faut que aut soit un pointeur :
Auteur *aut;
Auteur *aut;
progfann
Messages postés
365
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
23 septembre 2010
23
28 janv. 2009 à 16:09
28 janv. 2009 à 16:09
OUiii ça marche , merci bcp.. une derniere question:
Pour le destructeur comment je peux detruire un objet, ici j'ai appeler aut.~Auteur(); (PAs Sûre de cette ecriture :)), mais le programme plante..
j'ai fait plusieurs essai:
tjrs des erreurs :s
p.S. en fait l'association de 2 classes dans un seul programme m'a trop derangé :s:s mais aprés vos intervention je commence à comprendre .. Merci A VOUSSSS
Livre::~Livre(){ if(titre) delete[] titre; aut.~Auteur(); }
Pour le destructeur comment je peux detruire un objet, ici j'ai appeler aut.~Auteur(); (PAs Sûre de cette ecriture :)), mais le programme plante..
j'ai fait plusieurs essai:
Livre::~Livre(){ if(titre) delete[] titre; if(aut) delete aut; }
tjrs des erreurs :s
p.S. en fait l'association de 2 classes dans un seul programme m'a trop derangé :s:s mais aprés vos intervention je commence à comprendre .. Merci A VOUSSSS
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
28 janv. 2009 à 16:49
28 janv. 2009 à 16:49
La deuxième forme est meilleur, mais tu ne peux détruire explicitement que ce que tu as construits explicitement (c'est à dire par un new)
Normalement, la destruction de Livre entrainera automatiquement la destruction de son membre aut.
De toute manière, il me semble que l'on appel jamais explicitement un destructeur.
Ceci ne se fait pas automatiquement lorsque tu utilise un new, car tu peux utiliser le pointeur fourni pour diverses applications.
Ceci s'explique par la gestion mémoire d'un programme avec deux type de mémoire : la pile et le tas. Les variables créés sur un type de mémoire ne peuvent être alloué ou détruite explicitement tandis que sur l'autre type c'est possible (mais je ne me rappel jamais le quel est lequel.)
grosse lacune en pointeur ! comme le prouve le test "if(aut)" qui est de type Auteur et qui n'a aucune valeur de booléen !
Et aussi, quitte à faire du C++, utilise les strings plutôt que les char*, surtout que tu ne maitrise manifestement pas très bien.
Normalement, la destruction de Livre entrainera automatiquement la destruction de son membre aut.
De toute manière, il me semble que l'on appel jamais explicitement un destructeur.
Ceci ne se fait pas automatiquement lorsque tu utilise un new, car tu peux utiliser le pointeur fourni pour diverses applications.
Ceci s'explique par la gestion mémoire d'un programme avec deux type de mémoire : la pile et le tas. Les variables créés sur un type de mémoire ne peuvent être alloué ou détruite explicitement tandis que sur l'autre type c'est possible (mais je ne me rappel jamais le quel est lequel.)
grosse lacune en pointeur ! comme le prouve le test "if(aut)" qui est de type Auteur et qui n'a aucune valeur de booléen !
Et aussi, quitte à faire du C++, utilise les strings plutôt que les char*, surtout que tu ne maitrise manifestement pas très bien.