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 :

heritage et dynamic_cast


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut heritage et dynamic_cast
    Bonjour,

    J'ai une class abstraite Term et une autre class XTerm qui derive de Term. dans la Term je veux surcharger l'operateur de comparaison "<" et pour ca je veux faire :

    friend bool operator<(Term& term1,Term& term2){
    if((dynamic_cast<XTerm&>(term1)) != NULL && (dynamic_cast<XTerm&>(term2)) != NULL){
    ...comparer les attributs de XTerm
    }
    }

    Mais ca c'est pas possible car la class XTerm e definie apres la Term..Qu'est-ce que je peux pour que la conversion marche?

  2. #2
    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
    note :

    si tu fais

    dynamic_cast<XXX>(YYY) != NULL, il faut que XXX soit un pointeur et non une reference ... sinon ca fait une exception (bad_cast je crois ou quelquechose comme ca)

  3. #3
    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
    XTerm * a = dynamic_cast<XTerm *>(&term1);
     
    XTerm * b = dynamic_cast<XTerm *>(&term2);
     
    if ((a != NULL) && (b != NULL)){
     
    }
    note : si possible , utilise des references et des pointeurs constants

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    je comprends que tu dis mais je recois la meme erreur..

    Erreur 1 error C2680: 'XTerm *'*: type de cible non valide pour dynamic_cast

    Le probleme c'est qu'il ne sait pas que XTerm c'est enfant de Term..parce que je definis XTerm apres le Term.

  5. #5
    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
    dans ce cas, il faut faire une declaration de XTerm (prototype comme pour une fonction)

    note : pas besoin de preciser l arborescence de classe pour dynamique cast

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    J'ai la meme erreur...

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Term;
     
    class XTerm:public Term
    {
      ...
    };
     
    class Term
    {
       ...
    };

  8. #8
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    La class de base Term doit etre definie avant de faire l'heritage...

    Merci

  9. #9
    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
    class Term {
     
    public:
     
      virtual ~Term(){}
    };
     
    class XTerm : public Term {
     
    };
     
     
     
    bool operator < (const Term & t1,const Term & t2){
     
      const XTerm * a1 = dynamic_cast<const XTerm *>(&t1);
     
      const XTerm * a2 = dynamic_cast<const XTerm *>(&t2);
     
      if ((a1 != NULL) && (a2 != NULL)){
     
        return true;
      }
     
      return false;
     
    }
    J'ai moi meme aussi la meme erreur ... mais il est tout a fait possible de definir XTerm completement avant de definir le code de la comparaison...

    note que pour dynamic_cast, il faut au moins une methode virtuelle

  10. #10
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    oui..toutes mes methodes de Term sont virtuelles..Je crois que c'est une bonne idee definir l'operateur apres les declarations des classes.

    Merci beaucoup

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est pas vraiment la bonne solution. La comparaison entre objets XTerm doit être gérée dans XTerm, pas dans sa classe de base.

    Le problème de double-dispatch a été discuté quelques fois sur ce forum, fais un peu de recherche.

  12. #12
    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
    Citation Envoyé par Laurent Gomila
    C'est pas vraiment la bonne solution. La comparaison entre objets XTerm doit être gérée dans XTerm, pas dans sa classe de base.

    Le problème de double-dispatch a été discuté quelques fois sur ce forum, fais un peu de recherche.
    Effectivement, une classe ne devrait RIEN connaitre de ses classes derivees ...
    quand au probleme de double dispatch, va voir le lien

    Forum des développeurs > C et C++ > C++
    Comment utiliser le polymorphisme et pas les RTTI

    ... j y est ecris un exemple de double dispatch plus judicieux

  13. #13
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    Merci pour les solutions et pour le lien. Maintenant je sais quoi faire.

    @+

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

Discussions similaires

  1. Heritage multiple et dynamic_cast
    Par hpfx dans le forum Débuter
    Réponses: 5
    Dernier message: 04/02/2009, 22h26
  2. [Kylix] heritage multiple et interfaces :(
    Par le_barbu dans le forum EDI
    Réponses: 4
    Dernier message: 26/01/2004, 19h30
  3. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  4. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46
  5. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53

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