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
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:

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

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
J'y suis !
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);
    }
1
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
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 :
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" );
0
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
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:

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.
0
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
Salut.
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 !
0
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
Avez vous executé cette ligne:
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 !
0
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
Salut,
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;
}
0
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
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:

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)
0
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
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.
0
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
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?
0
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
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....
0
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
Non , juste je dois respecter l'enoncé, voila j'ai modifié mon poste ci-dessus
0

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
Est ce que tu peut nous écrire l'énoncé????
0
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
Soit la classe livre:

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. :)
0
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
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 !!
0
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
ç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
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?!
0
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
OK, ton probleme et le destructeur de la class auteur, enleve le et vois le resultas....!
0
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
ça marche :):):)

p.s. j'ai pas enlevé le destructeur
0
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
re :)

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?
0
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
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);
0
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
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
0
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
Lorsque j'ajoute la methode :

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 ..
0
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
attention, pour le new, il faut que aut soit un pointeur :
Auteur *aut;
0
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
OUiii ça marche , merci bcp.. une derniere question:

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