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 :

Pattern visiteur et template


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Par défaut Pattern visiteur et template
    J'essaie d'implémenter le pattern visiteur avec les templates

    Je n'ai qu'une seule classe dérivée et templatée

    Je travaille avec GCC 4.5 (donc c++11)

    fichier VisitorTemplate.hpp (j'ai spécialisé Derived dans le code de visit mais j'aimerais pouvoir utiliser n'importe quel type à l'avenir)

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #ifndef VISITORTEMPLATE_HPP_
    #define VISITORTEMPLATE_HPP_
     
    #include <iostream>
    #include <string>
    using namespace std;
     
    template<class T> class Derived;
     
    class Visitor
    {
     
      public:
        virtual void visit(Derived<string> *e) = 0;
     
    };
     
    class Base
    {
      public:
     
        virtual void accept(class Visitor *v) = 0;
    };
     
    template<class T>
    class Derived: public Base
    {
      public:
     
        virtual void accept(Visitor *v)
        {
           v->visit(this);
        }
     
        string display(T arg)
        {
           string s = "This is : " + to_string(arg);
           return s;
        }
     
    };
     
    class UpVisitor: public Visitor
    {
       virtual void visit(Derived<string> *e)
       {
         cout << "do Up on " + e->display("test") << '\n';
       }
     
    };
     
    class DownVisitor: public Visitor
    {
       virtual void visit(Derived<string> *e)
       {
         cout << "do Down on " + e->display("test") << '\n';
       }
     
    };
     
     
    #endif /* VISITORTEMPLATE_HPP_ */
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Base* base = new Derived<string>();
     
    Visitor* up = new UpVisitor();
    Visitor* down = new DownVisitor();
     
    base->accept(up);
    base->accept(down);
    Edit : j'ai modifié le code avec une déclaration anticipée de Derived et juste en dessous le code de Visitor
    Plus d'erreurs

    Maintenant je souhaiterais utiliser Derived<T> dans visit; malheureusement visit est virtual et donc impossible d'en faire une méthode template

  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 : 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
    Tu n'as pas copier exactement ton code ? Les lignes correspondent pas :s

    Sépares ton implémentation du header, tu ne peux pas utiliser les fonctions membres d'un type incomplet (ce qui est le cas avec une déclatation anticpée).

    Regardes l'article d'Emmanuel Deloget sur le visiteur acyclique, il pourrait t'être utile

  3. #3
    Membre très actif
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Tu n'as pas copier exactement ton code ? Les lignes correspondent pas :s

    Sépares ton implémentation du header, tu ne peux pas utiliser les fonctions membres d'un type incomplet (ce qui est le cas avec une déclatation anticpée).

    Regardes l'article d'Emmanuel Deloget sur le visiteur acyclique, il pourrait t'être utile
    Le visteur acyclique fait appel à dynamic_cast, ce que je cherche justement à éviter

  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
    Tu pourrais templater directement Visitor et Base par exemple je pense

  5. #5
    Membre très actif
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Tu pourrais templater directement Visitor et Base par exemple je pense
    autant pour Visitor je peux voir l'intérêt, autant pour Base pas trop, vu que je veux avoir des vector<Base*>

    et comment je fais avec les classe dérivées ?

    j'oubliais, j'aimerais aussi pouvoir passer des paramètres à visit; bien sûr la liste des paramètres varie en fonction de la classe dérivée

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Citation Envoyé par coda_blank Voir le message
    j'oubliais, j'aimerais aussi pouvoir passer des paramètres à visit; bien sûr la liste des paramètres varie en fonction de la classe dérivée
    Les template variadiques ne répondent-ils pas à ce besoin ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/01/2013, 22h36
  2. Pattern Composite et templates
    Par ternel dans le forum Langage
    Réponses: 10
    Dernier message: 21/08/2012, 11h19
  3. [débutante] Pattern visiteur
    Par ghani56 dans le forum Langage
    Réponses: 6
    Dernier message: 09/09/2009, 14h57
  4. [Visiteur] design pattern visiteur
    Par wsdl_adr dans le forum Design Patterns
    Réponses: 1
    Dernier message: 07/10/2008, 20h41
  5. [Visiteur] design pattern Visiteur ou Iterateur pour parcourir une arborescence?
    Par Invité dans le forum Design Patterns
    Réponses: 1
    Dernier message: 29/05/2008, 17h10

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