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 :

RTTI ou pas ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 48
    Points : 46
    Points
    46
    Par défaut RTTI ou pas ?
    Bonjour à tous,
    Je dispose du code suivant :

    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
     
    class B0
    {
       ...
    };
     
    class B1: public B0
    {
       ... 
    };
     
    class A0
    {
    public:
       virtual void fun(const B0& b0);
       virtual void fun(const B1& b1);
    };
     
    class A1: public A0
    {
    public:
       void fun(const B1& b1);
    };
     
    int main(int argc, char **argv)
    {
       A0 *a1 = new A1;
       B0 *b1 = new B1;
     
       a1->fun(*b1);
     
       delete b1;
       delete a1;
    }
    Je voudrais bien entendu que la ligne

    appelle la fonction fun de A1 prenant comme argument un objet de type B1... ce qui n'est pas le cas quand j'exécute ce code puisque c'est la fonction fun de A0 prenant comme argument un objet de type B0 qui est exécutée. Je précise ici que, comme dans le code simple présenté ici, je manipule également dans mon "vrai" code une collection d'objet de types parents A0 et B0 dont je ne connais pas forcément à l'avance le sous-type... La solution que j'ai trouvée pour le moment passe par la surcharge de la fonction virtuelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       virtual void fun(const B0& b0);
    de A0 dans A1, puis à l'intérieur de celle-ci, d'utiliser le RTTI pour appeler effectivement la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       void fun(const B1& b1);
    Cependant je ne trouve pas ça très propre et je me demandais s'il n'existait pas de solution plus jolie... Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce que tu veux c'est du multi-dispatch.
    Le paradigme OO classique ne fournit que du single-dispatch.

    Tu dois donc ici utiliser le pattern visiteur, qui est grosso modo équivalent à ce que tu fais (sauf que c'est constant et que ta technique est a priori linéaire).
    Boost ftw

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 48
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup. Je ne connaissais pas ce pattern mais en effet c'est exactement cela que je voulais faire.

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

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. Réponses: 6
    Dernier message: 31/05/2007, 22h36
  3. Réponses: 1
    Dernier message: 23/06/2002, 00h15
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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