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 

RTTI et héritage

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





PostPosted: Fri Oct 28, 2005 4:15 pm    Post subject: RTTI et héritage Reply with quote



Bonjour à tous,

j'ai un projet de simulateur de colonie de fourmis, et je cherche à
faire du C++ élégant, rigoureux et évolutif.

Je me heurte au problème suivant:
Un objet de classe /Ouvriere/ (sans jeu de mots) doit aller chercher des
objets dérivés d'une classe /Ressource/ sur les ordres de sa /Reine/. La
/Reine/ connait la hiérarchie des /Ressource/ mais /Ouvriere/ ne la
connait pas. La /Reine/ montre donc un échantillon de ce qu'elle veut
(par exemple des /Vegetaux/) et l'/Ouvriere/ doit parcourir le monde à
la recherche d'objets dérivant de /Vegetaux/.

Je n'ai pas trouvé ni dans dynamic_cast ni dans typeid de façon de
décider si un objet est d'une classe qui dérive de la classe d'un objet
de comparaison. Existe-t-il une méthode pour faire ça ?

Notez que je n'ai pas du tout commencé à implémenter tout ça donc si je
me trompe complètement sur l'architecture à utiliser, je suis preneur
d'explications.

Merci d'avance pour vos pistes,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Fri Oct 28, 2005 4:31 pm    Post subject: Re: RTTI et héritage Reply with quote



Vincent Jacques <jacquev6 (AT) cti (DOT) ecp.fr> writes:

Quote:
Je n'ai pas trouvé ni dans dynamic_cast ni dans typeid de façon de décider
si un objet est d'une classe qui dérive de la classe d'un objet de
comparaison. Existe-t-il une méthode pour faire ça ?

De memoire je n'en vois pas.

Quote:
Notez que je n'ai pas du tout commencé à implémenter tout ça donc si
je me trompe complètement sur l'architecture à utiliser, je suis
preneur d'explications.

Je ne connais pas tellement ce genre de simulation. Je ne vois rien
qui cloche avec l'architecture que tu proposes, ce qui ne veut pas
dire qu'il n'y a pas mieux.

Je ne vois pas de moyen simple d'y arriver. Definir dans toutes les
classes que la Reine puisse montrer un membre "correspond" qui lui
utilise le RTTI pour faire sa verification. C'est un peu fastidieux.
En jouant avec les template on peut faciliter l'implementation mais il
faut quand meme penser a le faire pour chaque classe.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Oct 28, 2005 4:36 pm    Post subject: Re: RTTI et héritage Reply with quote



On Fri, 28 Oct 2005 18:15:09 +0200, Vincent Jacques
<jacquev6 (AT) cti (DOT) ecp.fr>:

Quote:
doit aller chercher des
objets dérivés d'une classe /Ressource/

J'ai effectivement l'impression que le vague embryon de RTTI que le
C++ offre ne te sortira pas d'affaire ici.

La seule solution un peu élégante que je vois, c'est une fonction
EstClasseDerivee(), virtuelle, définie dans chaque classe dérivant de
Ressource.

On n'échappera pas à un #define ici...

#define MACRO_MON_PETIT_RTTI( nom_classe)
virtual bool EstClasseDerivee
(Ressource const* pointeur_a_analyser) const
{
return dynamic_cast<nom_classe const*> (pointeur_a_analyser)
!= NULL;
}

class Ressource
{
public:
MACRO_MON_PETIT_RTTI (Ressource)
};

class Vegetal: public Ressource
{
public:
MACRO_MON_PETIT_RTTI (Vegetal)
};

Je ne suis pas trop sûr que ça marche, je te laisse le soin de tester
tout ça...

Du coup, si la reine te donne un pointeur "ce_que_je_veux", et que tu
as un pointeur "ce_que_jai_trouve", ta quête est terminée si
ce_que_je_veux-> EstClasseDerivee (ce_que_jai_trouve) == true.


Back to top
Falk Tannhäuser
Guest





PostPosted: Fri Oct 28, 2005 4:44 pm    Post subject: Re: RTTI et héritage Reply with quote

Vincent Jacques wrote:
Quote:
Je n'ai pas trouvé ni dans dynamic_cast ni dans typeid de façon de
décider si un objet est d'une classe qui dérive de la classe d'un objet
de comparaison. Existe-t-il une méthode pour faire ça ?

As-tu regardé le "Visitor Pattern" ?

Falk

Back to top
kanze
Guest





PostPosted: Fri Oct 28, 2005 5:22 pm    Post subject: Re: RTTI et héritage Reply with quote

Vincent Jacques wrote:

Quote:
j'ai un projet de simulateur de colonie de fourmis, et je
cherche à faire du C++ élégant, rigoureux et évolutif.

Je me heurte au problème suivant:

Un objet de classe /Ouvriere/ (sans jeu de mots) doit aller
chercher des objets dérivés d'une classe /Ressource/ sur les
ordres de sa /Reine/. La /Reine/ connait la hiérarchie des
/Ressource/ mais /Ouvriere/ ne la connait pas. La /Reine/
montre donc un échantillon de ce qu'elle veut (par exemple des
/Vegetaux/) et l'/Ouvriere/ doit parcourir le monde à la
recherche d'objets dérivant de /Vegetaux/.

Je n'ai pas trouvé ni dans dynamic_cast ni dans typeid de
façon de décider si un objet est d'une classe qui dérive de la
classe d'un objet de comparaison. Existe-t-il une méthode pour
faire ça ?

class Resource
{
public:
// ...
virtual bool isSameTypeOrChild( Resource const* other ) const
{
return true ;
}
} ;

et dans toutes les classes dérivées :

virtual bool Vegetaux::isSameTypeOrChild(
Resource const* other ) const
{
return dynamic_cast< Vegetaux const* >( other ) != NULL ;
}

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Oct 28, 2005 7:32 pm    Post subject: Re: RTTI et héritage Reply with quote

On 28 Oct 2005 10:22:48 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:

Quote:
et dans toutes les classes dérivées :

Y a-t-il moyen de forcer une classe dérivée à définir cette fonction,
histoire d'avoir une erreur (ou au moins un warning) en cas d'oubli ?


Back to top
Vincent Jacques
Guest





PostPosted: Sat Oct 29, 2005 11:25 am    Post subject: Re: RTTI et héritage Reply with quote

Fabien LE LEZ a écrit :
Quote:
On 28 Oct 2005 10:22:48 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:


et dans toutes les classes dérivées :


Y a-t-il moyen de forcer une classe dérivée à définir cette fonction,
histoire d'avoir une erreur (ou au moins un warning) en cas d'oubli ?


Merci à vous quatre pour vos réponses, et merci à Fabien de poser la
question qui me vient après ;-)

A bientôt pour la réponse, j'éspère,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok

Back to top
James Kanze
Guest





PostPosted: Sat Oct 29, 2005 8:44 pm    Post subject: Re: RTTI et héritage Reply with quote

Fabien LE LEZ wrote:
Quote:
On 28 Oct 2005 10:22:48 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:

et dans toutes les classes dérivées :

Y a-t-il moyen de forcer une classe dérivée à définir cette
fonction, histoire d'avoir une erreur (ou au moins un warning)
en cas d'oubli ?

C'est plus difficile, je crois. La solution habituelle, c'est de
passer par une fonction non virtuelle qui vérifie que tout c'est
bien passé. Mais ici, je ne vois pas comment y arriver.

La seule chose que je vois, c'est que chaque classe peut
vérifier que si elle est base d'une autre classe, quelque part
dans l'hiérachie on la remplacé :

bool
MaClasse::isSameTypeOrChild(
Resource const* other ) const
{
assert( typeid( MaClasse ) == typeid( *this ) ) ;
return dynamic_cast< MaClasse const* >( other ) != NULL ;
}

Une autre possibilité, peut-être (je n'y ai pas encore réelement
refléchi), c'est au moyen d'une base virtuelle qui prend un
paramètre. Du coup, il faut que la classe la plus dérivée en
construit le paramètre (ce qui n'assure pas ce qu'elle fasse
correctement, mais qui assure au moins qu'elle a fait quelque
chose). Dans ce cas-là, on pourrait imaginer une interface, avec
une classe dérivée templatée, et que la base virtuelle prend un
pointeur à l'interface.

--
James Kanze mailto: [email]james.kanze (AT) free (DOT) fr[/email]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Back to top
Frédéric Lachasse
Guest





PostPosted: Sat Oct 29, 2005 9:44 pm    Post subject: Re: RTTI et héritage Reply with quote

"Vincent Jacques" <jacquev6 (AT) cti (DOT) ecp.fr> wrote

Quote:
Bonjour à tous,

j'ai un projet de simulateur de colonie de fourmis, et je cherche à faire
du C++ élégant, rigoureux et évolutif.

Je me heurte au problème suivant:
Un objet de classe /Ouvriere/ (sans jeu de mots) doit aller chercher des
objets dérivés d'une classe /Ressource/ sur les ordres de sa /Reine/. La
/Reine/ connait la hiérarchie des /Ressource/ mais /Ouvriere/ ne la
connait pas. La /Reine/ montre donc un échantillon de ce qu'elle veut (par
exemple des /Vegetaux/) et l'/Ouvriere/ doit parcourir le monde à la
recherche d'objets dérivant de /Vegetaux/.

Je n'ai pas trouvé ni dans dynamic_cast ni dans typeid de façon de décider
si un objet est d'une classe qui dérive de la classe d'un objet de
comparaison. Existe-t-il une méthode pour faire ça ?

Notez que je n'ai pas du tout commencé à implémenter tout ça donc si je me
trompe complètement sur l'architecture à utiliser, je suis preneur
d'explications.

La /Reine/ ne peut pas donner un échantillon de /Vegetaux/ car c'est une
classe abstraite. La /Reine/ doit donner un /SelecteurDeResource/ que
l'/Ouvriere/ va utiliser pour tester si la /Resource/ est compatible.

class SelecteurDeResource {
public:
virtual Resource* estCompatible(Resource*);
};

Un template permet de générer des SelecteurDeResource testant si la resource
derive d'une classe:

template <class T>
class Select : public SelecteurDeResource {
public:
virtual Resource* estCompatible(Resource* r) {
return dynamic_cast<T*>(r);
}
};

La /Reine/ va donc donner à l'/Ouvriere/ une réference vers un
SelecteurDeResource:

static Select<Vegetaux> selecteurDeVegetaux;
SelecteurDeResource& selecteur = selecteurDeVegetaux;

Que l'/Ouvrière/ utilise pour tester la compatibilité des resources
rencontrées:

if (selecteur.estCompatible(resource) != 0) {
...
}

Le méchanisme permet des critères de selection plus évolué que "est de type
...."

--
Frédéric Lachasse - ECP86



Back to top
Vincent Jacques
Guest





PostPosted: Mon Oct 31, 2005 11:07 pm    Post subject: Re: RTTI et héritage Reply with quote

Frédéric Lachasse a écrit :
Quote:
"Vincent Jacques" <jacquev6 (AT) cti (DOT) ecp.fr> wrote in message
news:djtiqa$hol$1 (AT) smilodon (DOT) ecp.fr...
j'ai un projet de simulateur de colonie de fourmis, et je cherche à faire
du C++ élégant, rigoureux et évolutif.

Je me heurte au problème suivant:
Un objet de classe /Ouvriere/ (sans jeu de mots) doit aller chercher des
objets dérivés d'une classe /Ressource/ sur les ordres de sa /Reine/. La
/Reine/ connait la hiérarchie des /Ressource/ mais /Ouvriere/ ne la
connait pas. La /Reine/ montre donc un échantillon de ce qu'elle veut (par
exemple des /Vegetaux/) et l'/Ouvriere/ doit parcourir le monde à la
recherche d'objets dérivant de /Vegetaux/.

La /Reine/ ne peut pas donner un échantillon de /Vegetaux/ car c'est une
classe abstraite. La /Reine/ doit donner un /SelecteurDeResource/ que
l'/Ouvriere/ va utiliser pour tester si la /Resource/ est compatible.

Le méchanisme permet des critères de selection plus évolué que "est de type
..."


Merci à tous pour vos réponses,

--
Vincent Jacques - ECP 2006 :-)

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok

Back to top
James Kanze
Guest





PostPosted: Tue Nov 01, 2005 8:51 pm    Post subject: Re: RTTI et héritage Reply with quote

James Kanze wrote:
Quote:
Fabien LE LEZ wrote:
On 28 Oct 2005 10:22:48 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:

et dans toutes les classes dérivées :

Y a-t-il moyen de forcer une classe dérivée à définir cette
fonction, histoire d'avoir une erreur (ou au moins un warning)
en cas d'oubli ?

C'est plus difficile, je crois. La solution habituelle,[...]

En fait, Frédéric Lachasse a donné la bonne réponse. Comme les
autres, je n'ai pas vu plus loin que le bout de mon nez.

--
James Kanze mailto: [email]james.kanze (AT) free (DOT) fr[/email]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


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.