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

MFC Discussion :

dois je utiliser dynamic_cast ?


Sujet :

MFC

  1. #1
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut dois je utiliser dynamic_cast ?
    Bonjour,
    j'ai une classe mere A qui est abstraite, et deux autres B et C qui heritent et definissent les methodes virtuelles de A.

    j'ai un pointeur de type B et je veux en obtenir un pointeur de type C.
    Je veux donc pouvoir appeler une des methodes virtuelles en tant que C (alors que j'ai un pointeur de type B).

    j'espere avoir été assez clair.

    PS: si je dois utiliser le dynamic_cast veuillez m'expliquer comment car j'ai tenté mais je recois un pointeur NULL (j'ai bien activé le RTTI dans VS).

    merci à vous.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    B est une A.
    C est une A.
    Mais B n'est pas une C.

    Il est donc normal de pas pouvoir appliquer les méthodes de la classe C sur une instance B, encore heureux.

    Alors, si B doit être en spécialisation de C, B devrait dériver de C et non de A.
    Cela règle tous les problèmes de cast, vu qu'ils ne servent à rien.

    Si B n'est pas une C, si vous devez utilisez une méthode de C sur une instance B, c'est que, très vraisemblablement, la méthode ne devrait pas être une méthode d'instance de C.

    Convertissez la méthode d'instance de C en méthode de classe ou en fonction libre qui prendra en paramètre une instance de B ou de A, en fonction de la sémantique du traitement.

    Vous êtes sûr que ces fonctions ne seraient pas mieux comme méthodes de B ?

  3. #3
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    appelons la methode virtuelle go(), chaque methode de chaque classe fille doit realiser un comportement different dans go(), mais il m'arrive a détecter que dans un cas (un bloc if) de la methode go() de la classe B on tombe sur le meme comportement de celui de go de la classe C, donc je me suis dit peut etre on peut considérer l'instance B comme etant une instance C et appeler la methode go().
    voilà j'espere encore etre assez claire et merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Citation Envoyé par subzero01 Voir le message
    considérer l'instance B comme etant une instance C
    C'est oui -> B dérive de C et go de la classe B peut appeler C::go().

    C'est faux ->
    Si le code de ma méthode go de C peut indifféremment travailler sur une instance de B ou de C, elle peut, très vraisemblablement, travailler sur une instance de A.

    Donc sémantiquement, C::go() est, peut-être, plus A::go() que C::go().
    Si vous transférez C::go() vers A::go(), vous n'avez plus de problème car B::go() peut appeler A::go().

    Si, pour des raisons de conception A::go() doit être virtuelle pure ou avoir une implémentation différente de l'actuelle C::go() ; vous pouvez toujours créer une méthode protected dans A, _go par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C::go(){return A::_go();};
     
    B::go(){...if(...){A::_go();}...};
    Il y a encore bien d’autres design patterns applicables en fonction de la vraie nature de A, B et C, mais n'essayez pas de mettre des ronds dans des carrés.

  5. #5
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    tres jolie explication.
    je vous remercie infiniment.
    je laisse tomber le caste et je copie colle la partie qui concerne le traitement voulu, c'est plus propre pour moi )
    a bientot

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Il n'y a que le mauvais code qui se copy-colle.

    Si vous ne voulez pas vous prendre la tête, faites une fonction libre avec le code commun.

    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
    void gogo(A& a,...)
    {
       a.titi = ...
    }
     
     
    C::go()
    {
       gogo(this);
    }
     
    B::go()
    {
    ...
       if(...)
       {
           gogo(this);
       }
    ...
    }

  7. #7
    Membre très actif Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Par défaut
    c'est un tres bon exemple je vais essayer d'en inspirer pour mon cas.
    merci pour tout

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/08/2007, 12h47
  2. [HTML] Quel DOCTYPE dois-je utiliser ?
    Par Azashub dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/10/2006, 08h53
  3. [SQL2005] Quelle collation dois-je utiliser ?
    Par StormimOn dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/08/2006, 11h03
  4. dois-je utiliser RMI?
    Par popopate dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/07/2006, 16h46
  5. Dois je utiliser Xml ?
    Par shaudron dans le forum XML/XSL et SOAP
    Réponses: 11
    Dernier message: 07/03/2006, 19h01

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