C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Implémentation pattern visitor

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
gof77
Guest





PostPosted: Fri Apr 02, 2004 5:30 pm    Post subject: Implémentation pattern visitor Reply with quote



Bonjour ,

Je souhaiterais utiliser le pattern visitor mais en l'adaptant légèrement.
Au lieu de :

class Visiteur {
visit(ClasseAbstraite *);
visit(ClasseConcreteA *);
visit(ClasseConcreteB *);
}

je voudrais avoir une classe abstraite Visiteur qui spécifierai seulement à
quelle hiérarchie la visite s'applique
(par exemple en donnant la classe abstraite) sans avoir à spécifier
l'ensemble des classes concrètes dérivées de la classe abstraite afin de
pouvoir faire évoluer ma hiérarchie sans remettre à jour ma classe Visiteur.

J'ai réfléchi en essayant de passer par des templates mais apparament ce
n'est pas si trivial que ca.

Donc si vous avez un moyen merci par avance

Cédric


Back to top
gof77
Guest





PostPosted: Fri Apr 02, 2004 8:03 pm    Post subject: Re: Implémentation pattern visitor Reply with quote



Précisions :

J'ai déjà essayé :

//====================

#include <iostream>

template<class T>
class Visitor
{
public:
virtual void process()
{
cout<<"Visitor"<
}

};

template class Visitable
{
public :
virtual void accept(Visitor<T> &) = 0;

};
class Vegetable;

class VegetableVisitor : public Visitor<Vegetable>
{
public :
void process()
{
cout<<"Vegetable visitor"< }
};

class Vegetable : public Visitable {
public :
void accept(Visitor<Vegetable> & vis){
vis.process();
};

};

int main()
{
VegetableVisitor visitor;
Vegetable potatoe;
cout<<"START"< visitor.accept(visitor);
cout<<"END"< return 0;

}

//===================
Resultat :
START
Visitor
END

//============

Pourquoi je ne passe pas dans le process de VegetableVisitor ??

"gof77" 406da2f5$0$31109$636a15ce (AT) news (DOT) free.fr...
Quote:
Bonjour ,

Je souhaiterais utiliser le pattern visitor mais en l'adaptant légèrement.
Au lieu de :

class Visiteur {
visit(ClasseAbstraite *);
visit(ClasseConcreteA *);
visit(ClasseConcreteB *);
}

je voudrais avoir une classe abstraite Visiteur qui spécifierai seulement
à
quelle hiérarchie la visite s'applique
(par exemple en donnant la classe abstraite) sans avoir à spécifier
l'ensemble des classes concrètes dérivées de la classe abstraite afin de
pouvoir faire évoluer ma hiérarchie sans remettre à jour ma classe
Visiteur.

J'ai réfléchi en essayant de passer par des templates mais apparament ce
n'est pas si trivial que ca.

Donc si vous avez un moyen merci par avance

Cédric





Back to top
Franck Branjonneau
Guest





PostPosted: Fri Apr 02, 2004 8:31 pm    Post subject: Re: Implémentation pattern visitor Reply with quote



"gof77" <ced1977__No__sPaM__ (AT) free (DOT) fr> écrivait:

Sous reserve de
Quote:
//====================

#include <iostream

using namespace std;

Quote:
[...]

visitor.accept(visitor);

potatoe.accept(visitor);

Quote:
[...]
//===================

J'ai :

START
Vegetable visitor
END

Le problème que tu rencontre montre une liaison statique.
Tu as bien :

void accept(Visitor
ou

void accept(Visitor<Vegetable> vis)

Et

virtual void process()

ou

void process()

?

[Merci d'élaguer tes messages.]
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
gof77
Guest





PostPosted: Fri Apr 02, 2004 10:36 pm    Post subject: Re: Implémentation pattern visitor Reply with quote

Comment passer outre cette liaison statique ?



Back to top
Franck Branjonneau
Guest





PostPosted: Sat Apr 03, 2004 10:56 am    Post subject: Re: Implémentation pattern visitor Reply with quote

"gof77" <ced1977__No__sPaM__ (AT) free (DOT) fr> écrivait:

Quote:
Comment passer outre cette liaison statique ?

Tu as vérifié qu'il n'y a pas de typo dans les deux fonctions que
j'ai soulignées ? En pariculier tu as bien

void accept(Visitor<Vegetable> & vis)

avec l'esperluette ?
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
gof77
Guest





PostPosted: Sun Apr 04, 2004 4:33 pm    Post subject: Re: Implémentation pattern visitor Reply with quote

J'ai trouvé une nouvelle version mais je voudrais savoir si elle fonctionne
chez vous ?
Car chez moi au niveau du dynamic_cast elle plante !!
Je ne comprends pas pourquoi d'ailleurs

//=========================
#include <iostream>

using namespace std;
//======================
//
//======================
class BaseVisitor
{
public:
virtual ~BaseVisitor(){}
};
//======================
//
//======================
template <class T>
class Visitor
{
public:
virtual void Visit(T&) = 0;
};


//======================
//
//======================
class BaseVisitable
{
public:
virtual ~BaseVisitable(){}
virtual void Accept(BaseVisitor &) = 0;
protected:
template<class T>
static void AcceptImpl(T& visited,BaseVisitor& guest)
{

if(Visitor<T>* p = dynamic_cast<Visitor(&guest))
{
p->Visit(visited);
}

}


};

#define DEFINE_VISITABLE()
virtual void Accept(BaseVisitor & guest)
{ AcceptImpl(*this,guest);}

//======================
// START OF THE IMP
//======================
class Vegetable : public BaseVisitable
{
public:
DEFINE_VISITABLE()
};

//======================
//
//======================
class Tomatoe : public Vegetable
{
public:
DEFINE_VISITABLE()
};

//======================
//
//======================
class Potatoe : public Vegetable
{
public:
DEFINE_VISITABLE()
};

//======================
//
//======================
class VegetableVisitor :
public BaseVisitor,
public Visitor<Vegetable>,
public Visitor<Potatoe>
{
public:
void Visit(Vegetable&){std::cout<<"Visit(Vegetable&)n";}
void Visit(Potatoe&){std::cout<<"Visit(Potatoe&)n";}

};



//======================
//
//======================
int main()
{
VegetableVisitor unJardinier;
Potatoe unePatate;
Vegetable* unLegume = &unePatate;
unLegume->Accept(unJardinier);


}

//======================
//
//======================


Back to top
Franck Branjonneau
Guest





PostPosted: Sun Apr 04, 2004 11:22 pm    Post subject: Re: Implémentation pattern visitor Reply with quote

"gof77" <ced1977__No__sPaM__ (AT) free (DOT) fr> écrivait:

Quote:
J'ai trouvé une nouvelle version mais je voudrais savoir si elle fonctionne
chez vous ?

Oui.

Quote:
Car chez moi au niveau du dynamic_cast elle plante !!

Mais encore ?

Quote:
Je ne comprends pas pourquoi d'ailleurs

Un bug du compilateur ? Un compilateur mal configuré (je crois savoir
que le support RTTI n'est pas actif par défaut avec VC)
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.