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 :

[conception] variations sur le pattern "Template Method"


Sujet :

C++

Vue hybride

r0d [conception] variations sur... 02/05/2006, 17h52
Matthieu Brucher Normalement, ça devrat... 02/05/2006, 18h06
r0d Euh, lesquels? J'ai bien... 02/05/2006, 18h18
Matthieu Brucher Là où tu as indiqué que tu... 02/05/2006, 18h47
r0d Oui en effet, c'était une... 03/05/2006, 10h22
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut [conception] variations sur le pattern "Template Method"
    Bonjour à tous,

    sur vos conseils, je suis parti sur l'implémentation d'un ensemble de classes en utilisant le Template Method. Ca donne à peu près ceci:
    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 Mere
    {
    [...]
    void  MethodImpl();
    virtual void MethodDerivate() = 0;
    };
     
    class Fille1 : public Mere
    {
    void MethodDerivate(){<mon code ici>}
    };
     
    class Fille2 : public Mere
    {
    void MethodDerivate(){<mon code (différent) ici>}
    };
    Cela fonctionait très bien. Mais voilà qu'aujourd'hui, je dois apporter une modification. En effet, la classe Fille2 va maintenant devoir gérer des données propres à elle que Fille1 n'aura pas. Prenons un tableau de int pour l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Fille2 : public Mere
    {
    void MethodDerivate(){<mon code (différent) ici>}
    vector<int> m_array;
    };
    Jusque là, tout va bien. Je voudrais maintenant une méthode qui modifie ce tableau, qui le vide par exemple. Donc j'ai fait cela:
    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
    class Mere
    {
    [...]
    void  MethodImpl();
    virtual void MethodDerivate() = 0;
    virtual void ClearArray() = 0;
    };
     
    class Fille1 : public Mere
    {
    void MethodDerivate(){<mon code ici>}
    void ClearArray(){m_array.clear();}
    vector<int> m_array;
    };
     
    class Fille2 : public Mere
    {
    void MethodDerivate(){<mon code (différent) ici>}
    void ClearArray(){}
    };
    Jusqu'ici tout va bien. Le problème c'est que maintenant, je voudrais appeler ClearArray depuis une méthode implémentée dans la classe Mere, ce qui nous donnerais quelque chose comme cela:
    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
    class Mere
    {
    [...]
    void  MethodImpl(ClearArray()); //modif ici
    virtual void MethodDerivate() = 0;
    virtual void ClearArray() = 0;
    };
    
    class Fille1 : public Mere
    {
    void MethodDerivate(){<mon code ici>}
    void ClearArray(){m_array.clear();}
    vector<int> m_array;
    };
    
    class Fille2 : public Mere
    {
    void MethodDerivate(){<mon code (différent) ici>}
    void ClearArray(){}
    };
    Mais là, ça ne fonctionne pas. Ca plante à l'exécution:
    R6025: pure virtual call.
    J'espère avoir été clair, et si vous m'avez suivi, je serais bien aise de recevoir vos conseils avisés

    merci.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Normalement, ça devrat marcher.
    Mais les "()" à la place des "{}", c'est une erreur de recopie ou pas ?

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Euh, lesquels?
    J'ai bien peur que ce ne soit pas une erreur de copier/coller, mais une erreur "tout court"

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Là où tu as indiqué que tu avais modifié le code de la classe mère.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Oui en effet, c'était une erreur. Et tu as raison, cela fonctionne, j'ai fait un test ce matin. Mon erreur est donc ailleurs.

    pour ton aide

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    pour info, et on ne sait jamais, quelqu'un pourra s'intéresser au problème un jour, je poste le code que j'ai testé ce matin et qui fonctionne parfaitement:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /// fichier.h
    #pragma once
    #include <vector>
     
    class CMere 
    {
    public:
        virtual ~CMere();
     
        virtual void f1() = 0;
        virtual void f2() = 0;
        void f3();
     
    protected:
        std::vector<int> m_vector1;
    };
     
     
    class CFille1 : public CMere
    {
    public:
        CFille1();
        ~CFille1();
     
        void f1();
        void f2();
     
    private:
    };
     
     
    class CFille2 : public CMere
    {
    public:
        CFille2();
        ~CFille2();
     
        void f1();
        void f2();
     
    private:
        std::vector<int> m_vector2;
    };
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    ///fichier .cpp
    #include "stdafx.h"
    #include "fichier.h"
     
    //////////////////////////////////////////////////////////////////////////
    CMere::~CMere()
    {
        m_vector1.clear();
    }
     
     
    void CMere::f3()
    {
        f2();
    }
     
    //////////////////////////////////////////////////////////////////////////
     
    CFille1::CFille1(){}
     
    CFille1::~CFille1(){}
     
    void CFille1::f1()
    {
        m_vector1.push_back(2);
    }
     
    void CFille1::f2(){}
     
    //////////////////////////////////////////////////////////////////////////
     
    CFille2::CFille2(){}
     
    CFille2::~CFille2()
    {
        m_vector2.clear();
    }
     
    void CFille2::f1()
    {
        m_vector1.push_back(2);
        m_vector2.push_back(3);
    }
     
    void CFille2::f2()
    {
        m_vector2.push_back(4);
    }

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/04/2011, 09h58
  2. Réponses: 2
    Dernier message: 26/12/2010, 22h08
  3. patron de méthode (Template method pattern)
    Par gilloull dans le forum Design Patterns
    Réponses: 6
    Dernier message: 20/10/2009, 17h26
  4. [Template] methode template d'une classe pas template
    Par bigquick dans le forum Langage
    Réponses: 8
    Dernier message: 25/03/2005, 15h09

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