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

Langage C++ Discussion :

Multi Dispatch, RTTI, polymorphisme


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Par défaut Multi Dispatch, RTTI, polymorphisme
    Bonjour,

    J'ai déjà effectué des recherches notamment sur le forum mais je n'arrive pas concrètement à voir la solution :

    Il s'agit peut être d'un problème classique mais je cherche à gérer la collision entre différents objets d'un petit jeu, sachant que les collisions ne sont pas identiques entre les différents objets :

    Pour faire simple, voila comment je pourrai gérer le collision pour chaque classe dérivée :

    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
     
    class Shape
      {
      public :
        virtual double GestionCollision( const Shape& p_shape ) = 0 ; 
      } ;
     
    class Circle : public Shape
      {
       public :
        virtual double GestionCollision( const Shape& p_shape ) ; 
      } ;
     
    class Rectangle : public Shape
     {
       public :
        virtual double GestionCollision( const Shape& p_shape ) ; 
      } ;
    et pour chaque fonction GestionCollision, il faudrait que je gère les cas possibles. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    double Circle : Intersect( const Shape& p_shape )
      {
      const type_info& monType = typeid( p_shape ) ;
      if( monType  == typeid( Rectangle ) )
      {
       //ma gestion
       ...
       }   
     
      }
    Sauf qu'a chaque nouvelle classe dérivée, je devrais ajouter la gestion de cette nouvelle forme . Ce n'est pas extensible et facilement maintenable.

    J'ai lu sur un lien récent du forum que les solutions à mon problème sont le double|multi Dispatch/le pattern observateur/RTTI.

    Seulement dans mon code appelant, je gère une liste de Shape et chaque itération je viens tester les collisions de cette manière :

    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
     
     
    BOOL ClasseAppelante::CheckShapeCollision(Shape* p_TestShape){
     
      vector<Shape*>::iterator iShape;
      for (iShape= m_vShape.begin(); iShape!= m_vShape.end(); iShape++)
      {
     
        if (p_TestShape == (*iShape))
          continue;
     
        // Test la collision
        if (p_TestShape->TestCollision(*iShape))
         //gestion collision
          return GestionCollision((*iShape), p_TestShape);
      }
     
    }
    Mon problème est que J'ai du mal à voir par exemple comment utiliser le pattern observateur ou RTTI et l'intégrer dans mon code. Je voudrais que cela reste générique et pouvoir ainsi ajouter de nouvelles classes sans toucher à ma classe de base et aux classes dérivées.

    J'espère avoir été clair

    merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Le problème c'est que t'as de la grosse répétition de code (les if et ça c'est pas franchement maintenable comme tu l'as dis), la bonne nouvelle c'est que ce code peut être générée par le compilateur...
    Loki fourni un systéme de multidispatch (à vraie dire plusieurs) dont un statique qui déroule deux typelists afin de tester toute les possibilités. Tu y trouveras certainement ce qu'il te faut.. (d'autant plus que l'exemple qu'il prend pour illustrer le besoin de ce multi dispatch est .. la gestion de collision entre des formes ).

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Par défaut
    En effet en regardant d'un peu plus près, ça a l'air de gérer le multi-method. Par contre, désolé mais je ne trouve pas l'exemple dont tu me parles..

    Et peut-on faire sans utiliser de librairies tierce?

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    C'est pas que ça à l'air.. C'est fait pour ><. (enfin la parti multidispatch de loki bien évidemment).
    Quand à l'exemple c'est ma faute, je faisais référence au bouquin qui va avec loki (Modern C++ design, d'Andrei Alexandrescu).

    Sans bibliothèque tierce? Oui c'est possible mais il te faut réinventer la roue. (et une bonne partie puisqu'il repose pas mal sur les typelists et les algos qui vont avec).

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Par défaut
    ok je te remercie mais comme je n'envisage pas (immédiatement) d'acheter le bouquin, existe-t-il une solution qui pourrait me convenir autre que loki ?

    merci

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Non mais la bibliothèque est sur sourceforge, t'es pas obligé d'acheter le bouquin pour l'avoir
    http://loki-lib.sf.net/

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Par défaut
    oui j'ai vu hier mais j'aime bien avoir des exemples d'utilisation (faut dire que j'ai pas encore vraiment cherché sur le net)

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par tiboo Voir le message
    oui j'ai vu hier mais j'aime bien avoir des exemples d'utilisation (faut dire que j'ai pas encore vraiment cherché sur le net)
    Rhoo, un petit effort
    http://loki-lib.svn.sourceforge.net/...ib/trunk/test/ (tests d'utilisation de chaque module de loki)
    http://www.google.com/codesearch?hl=...2B&sbtn=Search (utilisation de loki dans divers projets)

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

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [Web Services] Créer un dispatcher multi-applications
    Par MatthieuL dans le forum Spring
    Réponses: 0
    Dernier message: 13/12/2011, 09h59
  3. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  4. Réponses: 6
    Dernier message: 31/05/2007, 22h36
  5. Multi-acces a la BD Paradox
    Par _Rico_ dans le forum Paradox
    Réponses: 3
    Dernier message: 22/07/2002, 15h33

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