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] Comment utiliser le polymorphisme et pas les RTTI


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 99
    Points
    99
    Par défaut [RTTI] Comment utiliser le polymorphisme et pas les RTTI
    Bonjour à tous,

    Question architecture d'objet, à priori.

    je cherche une methode élégante (pas RTTI ou equivalent) et orientée objet pour coder un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    vector<object2D*> v;
    v.push_back(new square());
    v.push_back(new square());
    v.push_back(new circle());
    v.push_back(new circle());
    v.push_back(new circle());
    v.push_back(new circle());
     
    for (size_t i=0 ; i<v.size() ; i++)
    	for (size_t j=0 ; j<v.size() ; j++)
    		if (v[i]->collide(v[j]))
    			cout << i << "<->" << j << = <<"collide\n";
    j'ai une classe abstraite object2D et des classes dérivées d'object 2D : square et circle.
    je cherche a detecter les collisions entre square/square et square/circle avec les object2D que j'ai dans un vecteur d'object2D abstrait.

    un truc genre (gardez juste a l'esprit que c'est du pseudo code :p
    rien ne compile, rien ne marche) :
    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
     
    class object2D
    {
    	virtual bool collide(object2D* o) = 0;
    }
     
    class square : public object2D
    {
    	bool collide (object2D* o) //redef virtual methode
    	{
    		o->collide(dynamic_cast<square*>(this));
    	}
    	bool collide (square* s)
    	{
    		//code
    	}
    	bool collide (circle* c)
    	{
    		//code
    	}
    }
     
    class circle: public object2D
    {
    	bool collide (object2D* o) //redef virtual methode
    	{
    		o->collide(dynamic_cast<circle*>(this));
    	}
    	bool collide (square* s)
    	{
    		s->collide(dynamic_cast<circle*>(this));
    	}
    	bool collide (circle* c)
    	{
    		//code
    	}
    }
    tel quel ca ne marche pas car on se base sur la méthode virtuelle object2D::collide(object2D*) qui est défini au niveau d'object2D le parcours des tables de methode virtuelle ne fait ressortir que les collides avec object2D en parametre (et masque les autres versions)

    Quelqu'un à une idée de comment je pourrais faire autrement ?

    Fraggy

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 99
    Points
    99
    Par défaut quelqu'un peut il m'aider ?
    Si ce post n'est pas au bon endroit, dites moi ou le tranférer. Dans ODE et Bullet Physics Library chaque élément est typé soit il n'y a pas de conteneur d'objet abstrait soit on recast chaque objet dans le bon type.

    A force de creuser le pb j'ai l'impression que c'est pas possible de faire autrement.

    quelqu'un peut il m'aider ?

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 281
    Points : 11 029
    Points
    11 029
    Par défaut
    Tu as un problème de multidispatch.
    Le RTTI est une des solutions en C++ qui permette de résoudre cela.
    Modern C++ Design dédie un chapitre au multi-dispath avec justement des problèmes de collision en exemple.

    Tu peux affiner tes recherches avec ce mot clé.

    HTH,

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    bool testCollision(const square & src1,const square & src2){
     
      ...
    }
     
    bool testCollision(const square & src1,const sphere& src2){
     
      ...
    }
     
    ....
     
     
    class collider {
     
    public:
     
      virtual bool collide(const square &) const = 0;
     
      virtual bool collide(const sphere &) const = 0;
    };
     
    class squareCollider : public collider {
     
      squareCollider(const square & s) : object(s) {};
     
      bool collide(const square & src) const {
     
        return ::testCollision(object,src);
      }
     
      bool collide(const sphere &) const {
     
        return ::testCollision(object,src);
      }
     
     
     
      const square & object;
    };
     
     
     
    class geometric {
     
      virtual collider * getCollider() const = 0;
     
      virtual bool collide(collider * c) const = 0;
    };
     
    class sphere : public geometric {
     
      collider * getCollider() const { return new sphereCollider(*this);}
     
      bool collide(collide * c) const {
     
        return c->collide(*this);
      }
    };
     
    class square : public geometric {
     
    };
     
     
     
    bool final_collision(geometric * src1,geometric * src2){
     
      collider * c = src1->getCollider();
     
      bool result = src2->collide(c);
     
      delete c;
     
      return result;
    }

    Quelque chose qui ressemble a ca t irai ? (apres correction de tous les bug)

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Excellent Smashy !

    Le truc, c'est que ça, c'est exactement du RTTI !
    C'est pas le RTTI du compilo... mais c'est tout comme.

    D'ailleurs on peut rendre les objets sphereCollider et squareCollider statiques, en rajoutant un paramètre à la méthode (l'origine)... (ca évite les new trop lents à utiliser pendant des collision-detection).

    Et du coup...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (collider->GetCollider() == sphereCollider) {
      // collider est de type Sphere...
    }

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Sinon, si tu cherches à faire simplement du double-dispatch (et non du multi-dispatch), le pattern Visiteur peut t'y aider...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Points : 99
    Points
    99
    Par défaut Visiteur c'est trés interessant
    merci pour toutes vos réponses

    je vais voir avec visiteur, si je m'en sort !

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

Discussions similaires

  1. [WD17] utilisation des valeurs retournées pas les sélecteurs
    Par winsg dans le forum WinDev
    Réponses: 9
    Dernier message: 27/05/2014, 18h37
  2. Réponses: 2
    Dernier message: 03/06/2012, 23h07
  3. comment utiliser SAX pour ne pas afficher le contenu vide d'un Tag
    Par titi42 dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 14/08/2009, 11h48
  4. Réponses: 16
    Dernier message: 07/07/2009, 13h46

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