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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    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,
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    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 confirmé

    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Sinon, si tu cherches à faire simplement du double-dispatch (et non du multi-dispatch), le pattern Visiteur peut t'y aider...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    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
    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