IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Héritage et constructeur par copie


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut Héritage et constructeur par copie
    Bonjour à tou(te)s,

    J'ai un petit souci de compréhension

    J'ai une classe de base, et plusieurs classes qui hérite de celle-ci ou les unes des autres.
    J'ai un tableau (std::vector) qui contient des pointeurs sur ma classe de base afin que je puisse y stocker n'importe quelle classe, ca c'est l'avantage de l'héritage.

    Mon problème, lorsque je remplis ce tableau, je souhaite que le tableau contienne complètement les objets. Exemple, car c'est pas clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cBase * objet1; // ma classe de base
    monTableau.Add (objet1); //monTableau est une classe qui gère tout, et qui contient mon vecteur d'objets
    cSousBase* objet2; // cette classe hérite de ma classe de base
    monTableau.push_back (objet2);
    Une fois cela fait, si je détruis (sortie de fonction par exemple) mes 2 instances d'objets, mon tableau est mal en point
    Je voudrais donc garder la même utilisation, mais dans la méthode Add faire une copie de l'objet avant de l'ajouter à mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //au lieu d'un bête
    Add (cBase* o)
    {
     monVecteur.push_back (o);
    }
    //Avoir un truc genre
    Add (cBase* o)
    {
     //copie de l'objet
     o2 = (*o);
     //puis ajout de o2, ainsi o peut être détruit sans que cela me gêne
     monVecteur.push_back (&o2);
    }
    Mon problème c'est que ma méthode Add récupère un pointeur sur ma classe de base et le constructeur par copie qui est appelé est celui de ma classe de base et pas du tout celui de ma classe héritante. Ben oui, car je ne sais pas quelle classe est o et donc o2. Cela se passera donc bien pour objet1 mais pas pour objet2...

    Où c'est qu'c'est donc que j'me suis planté s'i'ou plait ?

  2. #2
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Bonjour,

    Tu t'es planté null part.
    Je dirai que stocké des pointeurs sur des objet dans un tableau puis détruire manuelment ces objet n'est pas une bonne chose. Il est préférable que ce soit le tableau qui se charge de la destruction de ces objets.

    Sinon dans ton cas la solution est une méthode duplicate() que tu va surcharger pour toute t'est sous classe. La méthode duplicate elle créé un nouvelle objet en utilisant le constructeur par recopie de la classe dans laquelle elle est définie (tu fait un new) et retourne un pointeur sur l'objet.
    Important la fonction doit avoir le modificateur virtuel pour toute les classes qui l'implémente.

    Si je suis pas clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class CObj
    {
         CObj(){};
         CObj(const CObj& CopyObj)
         {
            this = CopyObj;
         }
     
         ~CObj(){};
     
         virtual CObj* Duplicate()
         {
            return new CObj(this);
         }
    };
    Je te conseille la premier solution.

  3. #3
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Pour ta première réponse, je suis complètement d'accord. Mon tableau s'occupe de tout détruire proprement. Mais si je veux charger mes objets via une fonction qui lirait un fichier par exemple je veux :
    - lire le fichier
    - créer l'objet correspondant
    - l'ajouter au tableau
    - détruire l'objet créé à l'instant
    - jusqu'à la fin du fichier

    Et puis, après j'utilise mon tableau comme je veux.

    Ta méthode duplicate m'a l'air bien mieux que le constructeur par recopie ! Je te remercie, j'essaye ca de suite...

  4. #4
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Et ca marche parfaitement !

    Pour info : J'ai préféré appeler la méthode Clone pour correspondre à ce qui existe déjà, et j'ai, bien sur, remplacé new Obj(this) par new Obj(*this)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Constructeur par copie
    Par kacedda dans le forum C++
    Réponses: 16
    Dernier message: 05/05/2007, 12h38
  2. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  3. Réponses: 5
    Dernier message: 03/12/2006, 15h55
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo