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 :

Copie d'objet hérité


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut Copie d'objet hérité
    Bonjour.

    J'essaye de copier des objets hérités, mais il semble que l'héritage ne soit pas pris en compte.
    J'utilise pourtant que des fonctions virtuelles dans l'objet mère, et transfère l'objet en std::shared_ptr <Objet>.

    Voici un bout de code , où "_object_container" contient des objets "Object_HUD", hérités de l'objet mère "Object" :
    (j'aurais pus utilisé un froncteur pour chercher dirrectement l'objet par son nom, mais pour l'instant, c'est pas la question)

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
     
        std::shared_ptr < Object > model_Object ;
     
        for ( std::vector < std::shared_ptr < Object > > :: iterator it = _object_container.begin() ; it != _object_container.end() ; it ++ )
        {
            if( (*it) -> setName() == name )
            {
     
                model_Object = *it ;
     
            }
     
        }
     
        std::vector < std::shared_ptr < Object > > :: iterator it ;
     
        it = find ( _object_container.begin() , _object_container.end() , model_Object ) ;
     
        std::shared_ptr < Object > model ( new Object ( **it )) ;
     
        model -> getPosition ( x , y ) ;
     
        _object_container.push_back ( model ) ;
    L'objet est bien copié, mais en tant qu'Object, et non "Object_HUD"...

    Comme je le disais plus haut, l'objet mère ne contient que des fonctions virtuelles, et l'objet est copié en shared_ptr ...Il me semble donc respecter les condition pour effectuer une copie d'objet hérité...

    est-ce donc bien le cas ou j'ai oublié quelque chose / ou ca ne marche pas comme ca avec la copie des objets hérités.

    Merci si vous pouvez m'aider.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pour copier virtuellement, il faut "copier virtuellement".
    Pour ce faire, on utilise une fonction virtuelle qui copie l'objet, généralement nommée clone().

    Par exemple:
    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
    class Bidule {
    public:
        virtual Bidule clone() const {return Bidule();}
    };
     
    class SuperBidule : public Bidule {
    private:
        int i;
    public:
        SuperBidule(int a) : i(a) {}
        SuperBidule(SuperBidule const& other) : i(other.i) {}
        SuperBidule operator=(SuperBidule const& other) { i = other.i; return *this;}
     
        virtual SuperBidule clone() const {return *this;}
    };

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci pour votre réponse.

    Cela me semble être en effet la bonne solution, cependant, quand je tape ce code, il me dit :

    "error: invalid covariant return type for 'virtual Object_HUD Object_HUD::clone() const'
    "error: overriding 'vitrtual Object Object::clone() const'

    voici mes 2 objets :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    class Object
    {
     
    public :
     
        Object ( ) ;
        ~Object ( ) ;
     
        virtual Object clone() const { return Object() ; }
        ...
     
    protected :
     
        ...
    };
     
    class Object_HUD : public Object
    {
     
    public :
     
     
        Object_HUD(){}
        Object_HUD( Object_HUD const& other ){}
        Object_HUD operator = ( Object_HUD const& other ) { return *this ; }
     
        Object_HUD clone() const { return *this ; }
     
    protected:
     
        ...
    };
    Ais-je oublié quelque chose ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Les retours covariants c'est avec des pointeurs ou des références.

    Passes tes opérateurs de copie en protégé et utilises unique_ptr<Object> :
    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
    17
    18
    19
    20
    21
     
    struct Object
    {
      virtual std::unique_ptr<Object> clone() const 
      { return std::make_unique<Object>(*this) ; }
      virtual ~Object() {}
     
    protected :
      Object(Object const & rhs)
      { /*stuff*/ }
    };
     
    struct Object_HUD : Object
    {
      std::unique_ptr<Object> clone() const 
      { return std::make_unique<Object_HUD>(*this); }
     
    protected:
      Object_HUD(Object_HUD const & rhs)
      { /*stuff*/ }
    };

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Merci pour la correction.
    Ca fait longtemps que je n'avais plus écrit un clone...

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    En passant par des fonctions libres, il y a moyen d'émuler des retours covariants tout en renvoyant des pointeurs intelligents. Cf ce très récent article qui détaille la démarche: http://cppcodereviewers.com/covarian...mart-pointers/
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Oui, ca marche ! ( j'ai plutôt utilisé un std::shared_ptr <Object> dans mon cas, mais le resultat est le même )

    Merci pour vos réponses !

Discussions similaires

  1. Probleme copie d'objet dans un tableau
    Par ché dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/12/2006, 12h15
  2. [FLASH 8] Copy d'objets
    Par bibile dans le forum Flash
    Réponses: 3
    Dernier message: 13/09/2006, 17h18
  3. Méthode de classe et copie d'objets
    Par Duloup dans le forum Général Python
    Réponses: 5
    Dernier message: 11/04/2005, 16h27
  4. [VB6] Copie d'objet
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 23/08/2004, 10h04
  5. [VB6] Copie d'objets
    Par austin49 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/05/2003, 18h05

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