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 :

Conversion d'une classe mère en classe fille


Sujet :

C++

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Conversion d'une classe mère en classe fille
    Bonjour,

    je dois ajouter de nouvelles fonctionnalité à un code C++.
    Ce code utilise une bibliothèque externe LIB, et notamment des instances de LIB::Object.
    La classe LIB::Object admet pour attribut un entier info.
    Les instances de LIB::Object sont concrètement déclarées en tant qu'Object via un typedef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef LIB::Object Object;
    Ainsi, j'ai des bouts de code du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object instance = LIB::fonction_retournant_une_instance_de_Object();
    instance->info() = 1;
    La classe LIB::Object n'est pas documentée.
    En particulier, il n'y a pas d'erreur de syntaxe dans la dernière ligne : il semblerait que le pattern Iterator soit utilisé dans son implementation.

    J'ai besoin de pouvoir stocker non plus un entier "info" mais 2 entiers, disons "info" et "data."


    Ma première idée a été de remplacer le typedef par classe héritant publiquement de LIB::Object :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Object : public LIB::Object
    {
    private:
      int data;
    };
    Le souci avec cette approche est que je tombe sur un problème de conversion de LIB::Object vers Object à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object instance = LIB::fonction_retournant_une_instance_de_Object();
    J'aurais bien ajouté un constructeur et un opérateur d'affectation,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object(LIB::Object const &);
    Object & operator=(LIB::Object const &);
    mais je ne vois pas comment les implémenter sans connaître l'implémentation de LIB::Object, en particulier ses attributs.

    Est-ce possible de copier tous les attributs d'une classe mère dans une classe fille de manière automatique?


    En solution de contournement, je fais un héritage par composition qui me permet d'automatiser cette tâche mais ce n'est pas super pratique car cela engendre énormément de modifications dans le code.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Est-ce possible de copier tous les attributs d'une classe mère dans une classe fille de manière automatique?
    C'est la notion de protected

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Il y a un petit malentendu.
    Je formule mieux ma question :
    est-il possible de copier automatiquement les valeurs des attributs d'une instance d'une classe dans les attributs d'une instance (différente!) d'une classe dérivée?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Object(LIB::Object const &o):
      LIB::Object(o),
      data(42)
    {
    }
    ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Merci beaucoup!

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    C'est le truc de base. Je reprends le post Ehonn de sur ce sujet

    Citation Envoyé par Ehonn Voir le message
    Citation Envoyé par Boumbata Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyObject::MyObject()
        : m_int_attribut(0) // on peut initialiser un attribut comme ceci...
    {
        m_double_attribut = 0.0; // ... ou comme cela...
    }
    En C++, on utilise la liste d'initialisation pour initialiser les attributs. Dans le corps du constructeur, c'est une affectation (pas une initialisation).
    Sinon JolyLoic utilise le constructeur par recopie: il faut qu'il en est 1

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par foetus Voir le message
    Sinon dans le code de JolyLoic, il manque une virgule
    Merci, en effet, je viens de l'ajouter.

    Citation Envoyé par foetus Voir le message
    Et de plus JolyLoic utilise le constructeur par recopie: il faut qu'il en est ait 1
    S'il n'en n'avait pas, le code Object instance = LIB::fonction_retournant_une_instance_de_Object(); ne marcherait pas
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par foetus Voir le message
    C'est le truc de base.
    désolé, je n'ai pas pratiqué suffisamment depuis un petit moment et j'ai oublié certaines choses.
    Mea culpa!

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

Discussions similaires

  1. Caster classe mère et classe fille
    Par zsoufianz dans le forum Général Java
    Réponses: 1
    Dernier message: 02/12/2014, 03h36
  2. [POO] Accès à une propriété de la classe mère
    Par hornetbzz dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2010, 23h16
  3. Réponses: 2
    Dernier message: 14/10/2009, 09h31
  4. caster une classe mère en classe fille
    Par franchouze dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/10/2009, 11h56
  5. Réponses: 14
    Dernier message: 06/06/2009, 21h42

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