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 :

Fonction template pour copie polymorphe


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut Fonction template pour copie polymorphe
    Bonjour a tous,

    Une question pour savoir si ce genre de chose est réalisable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Mere
    {
    public:
    /*
    ...
    */
    template<class T>
    T* getCopie( void ){ return  new T(*this);};
    }
    Afin que toutes les filles qui héritent de mère possèdent un getCopie qui retourne leur copie et que je puisse appeler via un fille->getCopie();

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class T>
    class Mere<T>
    {
    	T* getCopie( void ){ return  new T(*this);};
    };
     
    class Fille : Mere<Fille>
    {
    };

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    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 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Bonjour à toi,
    Ce n'est pas du tout une template qu'il te faut, mais un retour covariant.

    Lis donc dans la faq les questions de retour covariant et de copie polymorphe

    Par ailleurs, juste pour le style, makeCopy(), copy() ou encore clone() serait de meilleurs nom de fonctions. En effet, ce n'est pas un get, parce que la copie n'est pas une propriété de l'objet.

    La solution d'oodini fonctionne aussi, et s'appelle CRTP: Curiously Recurring Template Pattern (pour le P, je ne suis pas sûr, serait-ce TemPlate?)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par leternel Voir le message
    Ce n'est pas du tout une template qu'il te faut, mais un retour covariant.
    Étrange, puisque tu dis plus bas que ma solution fonctionne.
    En fait, il lui faut un retour covariant à base de template s'il n'a pas besoin de polymorphisme.

    Citation Envoyé par leternel Voir le message
    Par ailleurs, juste pour le style, makeCopy(), copy() ou encore clone() serait de meilleurs nom de fonctions. En effet, ce n'est pas un get, parce que la copie n'est pas une propriété de l'objet.
    Effectivement.

    Citation Envoyé par leternel Voir le message
    La solution d'oodini fonctionne aussi, et s'appelle CRTP: Curiously Recurring Template Pattern (pour le P, je ne suis pas sûr, serait-ce TemPlate?)
    Pattern.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci pour vos retours,

    Citation Envoyé par leternel Voir le message
    Bonjour à toi,
    Lis donc dans la faq les questions de retour covariant et de copie polymorphe
    justement c'est ce que je veux faire,
    Mais j'ai tellement de classe fille qu'il me serait plus facile de la définir une unique fois dans la mère.

    Ok pour le nom c'est vrai c'est un mauvais choix.

    Citation Envoyé par oodini Voir le message
    En fait, il lui faut un retour covariant à base de template s'il n'a pas besoin de polymorphisme.
    Je ne comprend pas ta remarque, le fait d'utiliser un template casse t il quelque chose a ce qui est expliqué dans la faq par rapport aux retours covariants pour la copie polymorphe ?

    EDIT: Et pour des ca comme celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template <class T>
    class Mere<T>
    {
    	T* getCopie( void ){ return  new T(*this);};
    };
     
    class Fille : Mere<Fille>
    {
    };
    class PetiteFille : Fille/*<PetiteFille >*/ ??
    {
    };
    Merci d'avance

    Merci,

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Je ne comprend pas ta remarque, le fait d'utiliser un template casse t il quelque chose a ce qui est expliqué dans la faq par rapport aux retours covariants pour la copie polymorphe ?
    Ma solution n'est pas valide si tu voulais utiliser le polymorphisme dynamique, par exemple stocker dans un conteneur des pointeurs vers la classe mère.
    Car avec ma solution, il n'y a en fait pas de classe mère : toutes les classes mères sont différentes (Mere<Fille1>, Mere<Fille2>...), et tu ne peux donc utiliser le polymorphisme.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Ok merci je comprends,
    Donc du coup je ne peux pas l'utiliser car je les stocke justement :/

    Je saurais pour la prochaine,
    Merci!

  8. #8
    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
    Rien n'empêche de faire dériver toutes tes Mere<T> d'une même classe de base.
    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.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    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 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Pour la solution de oodini, ou "clonage template", la classe de "base" n'est pas une mère classique, mais plutot une classe template utilisé par héritage, que je nommerai utils::clonable<T>
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2013, 12h00
  2. Réponses: 3
    Dernier message: 13/10/2012, 16h02
  3. Réponses: 4
    Dernier message: 09/09/2010, 19h14
  4. fonction template pour container
    Par Bourrine dans le forum Langage
    Réponses: 8
    Dernier message: 26/06/2007, 14h55

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