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

Langage C++ Discussion :

Design clone et template


Sujet :

Langage 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
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut Design clone et template
    Bonjour à tous,

    J'ai actuellement besoin d'une classe utilisant un design clone mais le problème est que la classe en nécessitant est une classe "double" template (typename T, typename U).

    Je ne peux donc pas utiliser (dans ma classe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual std::auto_ptr<T> Clone() const =0;
    puisque la classe est double template.

    Ma question est simple : comment puis-je faire ?

    Si vous voulez de plus amples explications, notamment sur cette fameuse classe ou si vous voulez savoir quelles sont les raisons qui me poussent à utiliser ce design, n'hésitez pas !

  2. #2
    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 : 34
    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
    Bonjour,

    Je ne comprends pas trop ta question. Tu parles bien de ça : http://cpp.developpez.com/faq/cpp/?p...es#CLASS_clone ?

    Ce qu'on retourne c'est un pointeur sur un objet du type de la classe, si la classe est template alors on retourne un pointeur du type de la classe avec les même paramètres template (il n'y a pas besoin de les marquer, ils sont "automatique" au sein de la classe).

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Effectivement je ne sais pas pourquoi je pensais que c'était impossible

    Sujet somme toute résolu bien qu'assez inutile

    Merci à toi

    Edit : en fait j'ai quand même un probpème . Le code compile mais les objets ne sont pas du bon type : dans ma classe mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T, typename U>
    class Curve
    {
        public:
            [...]
            virtual ~Curve()
            {}
     
            virtual Curve* Clone() const = 0;
            [...]
    };
    et dans une des classes fille :
    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
    template <typename T, typename U>
    class PolynominalCurve3rdDegree : public Curve<T,U>
    {
        public:
            [...]
            ~PolynominalCurve3rdDegree(){}
     
            PolynominalCurve3rdDegree* Clone() const;
            [...]
    };
     
    ...
     
    template <typename T, typename U>
    PolynominalCurve3rdDegree<T,U>* PolynominalCurve3rdDegree<T,U>::Clone() const
    {
        return new PolynominalCurve3rdDegree (*this);
    }
    Ainsi, lorsque je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Curve<int, double> *B = new PolynominalCurve3rdDegree<int,double>(8,6,5,2,7,9);
    Curve<int, double> *A = B->Clone();
    A n'est pas une PolynominalCurve3rdDegree<int,double> car je ne peux pas accéder aux fonctions membres propres à cette classe et la taille de (*A) est la même que celle de (*B) et la même que celle d'un objet de type Curve<int,double>, et non celle d'un objet de type PolynominalCurve3rdDegree<int,double>.

    Me suis-je trompé quelque part dans le design ? N'ai-je pas bien compris celui-ci ?

    Enfin je verrai cela demain je commence à fatiguer

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    Effectivement, tu utilises la fonction Clone de Curve qui te retourne une Curve, et que tu stockes dans un pointeur sur Curve.
    Il faut donc que tu fasses un static_cast vers PolynomialCurve3rdDegree pour accéder aux fonctions de cette classe.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Effectivement, merci pour cette réponse claire

    Sujet résolu

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Soit, toutefois, attentif au fait que si tu as besoin de transtyper ton Curve<int , double> * en PolynominalCurve3rdDegree<int, double> *, c'est, peut etre, que tu es confronté à un problème de conception dans le sens où tu as été "assez bête" que pour... perdre le fait que tu travaillais avec un PolynominalCurve3rdDegree

    Peut etre devrais tu envisager la mise en place d'un pattern de type "visiteur" (ou similaire) qui te donnerait l'occasion de récupérer un PolynominalCurve3rdDegree<int, double>

    En outre, on peut toujours se poser la question de l'opportunité réelle de maintenir dans une même collection des objets dont le type réel hérite de Curve<int, double> mais qui ne sont pas tous de type PolynominalCurve3rdDegree<int, double> ...

    Mais ca, cela dépend de ton projet et je ne m'avancerai pas sur ce point

    Enfin, il serait peut etre intéressant de s'intéresser pré / post conditions et aux invariants de Curve et de PolynominalCurve3rdDegree, car je ne suis pas persuadé du tout (sans rien savoir de ton projet, encore une fois) qu'il soit effectivement opportun d'avoir un héritage dans le sens où les pré / post conditions et les invariants *risquent* de violer le principe de substitution de Liskov (un peu comme le ferait une liste triée héritant de liste)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Bénévole] Web designer pour Template Joomla 1.5.X
    Par wace dans le forum Autres
    Réponses: 0
    Dernier message: 08/09/2009, 11h08
  2. Template de Design Pattern
    Par youkoun dans le forum BOUML
    Réponses: 10
    Dernier message: 05/05/2008, 16h54
  3. Design template Creloaded
    Par ptityop dans le forum Autres
    Réponses: 0
    Dernier message: 14/12/2007, 15h37
  4. Réponses: 1
    Dernier message: 10/01/2007, 21h52

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