Partage
  • Partager sur Facebook
  • Partager sur Twitter

constructeur de copie et heritage

    20 octobre 2007 à 11:27:49

    Bonjour voila dans mon programme j'ai trois classes vehicule velo et type de velo voici donc le code de leur fichier respectif. Ma question est la suivante comment coder le constructeur de copy de la class velo ? comment faire pour que un velo(v2) récupère la marque,le modele,le nbvitesse et le type.... d'un velo(v1) ?
    vehicule.h
    1. #ifndef vehicule_h
    2. #define vehicule_h
    3. class vehicule
    4. {
    5.         protected :
    6.         //propriété
    7.         long id_vehicule;
    8.         long nbplace;
    9.         string marque;
    10.         string modele;
    11.         string couleur; 
    12.         //méthode
    13.         vehicule();
    14.         vehicule(long,long,string,string,string);
    15.         vehicule(const vehicule&);
    16.         void affiche();
    17. };
    18. #endif

    vehicule.cpp:
    1. #include<iostream>
    2. using namespace std;
    3. #include "vehicule.h"
    4. vehicule::vehicule()
    5. {
    6.         id_vehicule=0;
    7.         nbplace=0;
    8.         marque="";
    9.         modele="";
    10.         couleur="";
    11. }
    12. vehicule::vehicule(long pid_vehicule,long p_nbplace,
    13. string p_marque,string p_modele,string p_couleur)
    14. {
    15.         id_vehicule=pid_vehicule;
    16.         nbplace=p_nbplace;
    17.         marque=p_marque;
    18.         modele=p_modele;
    19.         couleur=p_couleur;
    20. }
    21. vehicule::vehicule(const vehicule &copy_vehicule)
    22. {
    23.         id_vehicule=copy_vehicule.id_vehicule;
    24.         nbplace=copy_vehicule.nbplace;
    25.         marque=copy_vehicule.marque;
    26.         modele=copy_vehicule.modele;
    27.         couleur=copy_vehicule.couleur;
    28. }
    29. void vehicule::affiche()
    30. {
    31.         cout<<"id du vehicule : "<<id_vehicule<<endl;
    32.         cout<<"nbplace du vehicule : "<<nbplace<<endl;
    33.         cout<<"marque du vehicule : "<<marque<<endl;
    34.         cout<<"modele du vehicule : "<<modele<<endl;
    35.         cout<<"couleur du vehicule : "<<couleur<<endl;
    36. }

    typevelo.h:
    1. #ifndef typevelo_h
    2. #define typevelo_h
    3. class typevelo
    4. {
    5.         private :
    6.         string lib;
    7.         public :
    8.         typevelo();
    9.         typevelo(string);
    10.         typevelo(const typevelo&);
    11.         void affiche();
    12. };
    13. #endif

    typevelo.cpp:
    1. #include<iostream>
    2. using namespace std;
    3. #include "typevelo.h"
    4. typevelo::typevelo()
    5. {
    6. lib="";
    7. }
    8. typevelo::typevelo(string plib)
    9. {
    10.         lib=plib;
    11. }
    12. typevelo::typevelo(const typevelo &copy_typevelo)
    13. {
    14.         lib=copy_typevelo.lib;
    15. }
    16. void typevelo::affiche()
    17. {
    18.         cout<<"type de velo : "<<lib<<endl;
    19. }

    velo.h :
    1. #ifndef velo_h
    2. #define velo_h
    3. #include "typevelo.h"
    4. #include "vehicule.h"
    5. class velo : public vehicule
    6. {//velo herite de vehicule donc attention pour
    7. //le constructeur ne pas oublier les propriétés de véhicule 
    8.         private :
    9.         long nbvitesse;
    10.         typevelo *pt_typevelo; 
    11.         public :
    12.         velo();
    13.         velo(long,long,long,string,string,string,string);
    14.         velo(const velo&);
    15.         void affiche()
    16. };
    17. #endif

    velo.cpp :
    1. #include<iostream>
    2. using namespace std;
    3. #include "velo.h"
    4. velo::velo()
    5. :vehicule()     
    6. {
    7.         nbvitesse=0;
    8.         pt_typevelo= new typevelo();
    9. }
    10. velo::velo(long pid_vehicule,long p_nbplace,long p_nbvitesse,
    11. string p_marque,string p_modele,string p_couleur,string p_lib)
    12. :vehicule(pid_vehicule,p_nbplace,p_marque,p_modele,p_couleur)
    13. {
    14. nbvitesse=p_nbvitesse;
    15. pt_typevelo= new typevelo(p_lib);
    16. }
    17. /*Comment faire pour coder ce constructeur de copie ???? *
    18. velo::velo(const velo &copy_velo)
    19. :vehicule(copy_velo.id_vehicule,copy_velo.marque,
    20. copy_velo.modele,copy_velo.couleur,copy_velo.nbplace)
    21. {
    22.         nbvitesse=copy_velo.nbvitesse;
    23.         pt_typevelo=new typevelo(copy_velo.pt_typevelo);       
    24. }*/
    25. void velo::affiche()
    26. {
    27.         vehicule::affiche();
    28.         pt_typevelo->affiche();
    29.         cout<<"nbvitesse du velo : "<<nbvitesse<<endl;
    30. }



    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2007 à 12:20:04

      Quand tous les attributs de tes classes sont copiables, tes classes le deviennent (copiables) implictement sans que tu n'aies rien à faire.

      Bémol, dans le cas de hiérarchies d'objets polymorphes,
      - soit la copie de sert à rien (et donc il faut l'interdire avec l'affectation),
      - soit il faut recourrir à une feinte qui clone les objets (-> FAQ C++ de developpez)

      Autrement, il suffit d'appeler le constructeur de copie parent depuis la liste d'initialisation.
      1. class Parent {
      2. protected:
      3.     Parent(Parent const& rhs)
      4.     : m_truc_qui_nest_pas_copiable(rhs.m_truc_qui_nest_pas_copiable.duplique())
      5.     , m_truc_copiable(rhs.m_truc_copiable)
      6.     {}
      7. public:
      8.     virtual Enfant * clone() const = 0;
      9. private:
      10.     TypePasCopiableMaisDuplicable m_truc_qui_nest_pas_copiable;
      11.     TypeCopiable                  m_truc_copiable;
      12. private: // affectation incompatble avec héritage => interdiction
      13.     Parent & operator=(Parent const& rhs);
      14. };
      15. class Enfant : public Parent
      16. {
      17. protected:
      18.     Enfant(Enfant const& rhs)
      19.     : Parent(rhs)
      20.     , m_nouveau_champ(rhs.m_nouveau_champ)
      21.     {}
      22. public:
      23.     virtual Parent * clone() const { return new Enfant(*this); }
      24. private:
      25.     AutreTypeCopiable m_nouveau_champ;
      26. };


      EDIT: retour covariant
      EDIT2: j'ai cliqué par mégarde sur "alerter les modérateurs. Désolé si cela vous notifie directement :("
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

      constructeur de copie et heritage

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown