Besoin d'aide C++
Résolu
progfann
Messages postés
365
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Voila je suis debutante en c++, j'ai besoin de quelques explication concernant un truc en c++, avec un exemple , je vais montrer la partie que j'ai pas compris:
j'ai une classe auteur:
une autre classe livre:
Voila je veux savoir si on a fais l'heritage ou quoi, parce que j'ai pas encors vu ça, sinon, comment je peux initialiser les attributs d'une classe à partir d'une autre classe??
Voila je suis debutante en c++, j'ai besoin de quelques explication concernant un truc en c++, avec un exemple , je vais montrer la partie que j'ai pas compris:
j'ai une 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(); }; /// ... (definition des methodes)
une autre classe livre:
class Livre{ private: int numero; char *titre; Auteur aut; <== public: Livre(int numero=0,char *titre="",char *nom="",char *prenom="",char *pays=""); <== Live(Livre&); ~Livre(); }; /// ... (definition des methodes)
Voila je veux savoir si on a fais l'heritage ou quoi, parce que j'ai pas encors vu ça, sinon, comment je peux initialiser les attributs d'une classe à partir d'une autre classe??
13 réponses
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); }
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" );
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.
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 !
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)
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....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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. :)
ç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?!
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?
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);
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
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
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.