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 :

opérateur dynamic_cast


Sujet :

C++

  1. #1
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut opérateur dynamic_cast
    Salut,
    j'ai besoin de tester le type d'un argument reçu comme void * dans la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void    Toto::handler(void *arg)
     {
         MyType *test = (MyType *)arg;
         if (dynamic_cast<MyType *>(test)) != NULL)
             cout << "-> arg is a MyType" << endl;
         else
             cout << "-> arg is not a MyType" << endl;
     }
    Quelque soit le type d'objet dont je passe un pointeur en paramètre a Toto::handler, le cast ne renvoie jamais NULL. Je compile sous Visual Studio 2005 donc l'option /GR devrait être activée par défaut... j'utillise mal l'opérateur dynamic_cast à mon avis. Qq1 peut m'expliquer?
    merci :-)

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    merci mais meme en connaissant la théorie je n'arrive pas à résoudre mon exemple :-(

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Ca défini bien la variable test comme un MyType*
    On peut toujours tester ensuite si son type est bien MyType*, ce sera toujours vrai !

    Il faut tester le type de arg :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (dynamic_cast<MyType *>(arg)) != NULL)
    On ne peut pas faire boire un âne qui n'a pas soif.

  5. #5
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Ben justement, quand j'essaye de caster arg directement, Visual Studio refuse de compiler:
    'void *' : invalid expression type for dynamic_cast

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Explication lue dans le livre de stroustrup:
    le compilateur ne peut emettre aucune hypotheses concernant la mémoire pointée par un void * ,cela implique que dynamic_cast qui doit examiner l'objet pour en determiner le type ne peut effectuer une conversion à partir d'un void * .

    Il te faudra donc faire un static_cast vers un objet acceptable avant de le tester par dynamic_cast...


  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Exact, j'ai répondu un peu vite, on ne peut pas faire de dynamic_cast à partir d'un void*.

    Cependant, un static_cast suivi d'un dynamic_cast, ça me semble imprévisible si le static_cast n'est pas correct, c'est à dire si on ne sait pas du tout de quel type est l'argument.

    Je pense qu'il faut changer le type d'argument pour utiliser une interface ou une classe de base à la place d'un void*. (c'est pas bien les void* )
    On ne peut pas faire boire un âne qui n'a pas soif.

  8. #8
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Cependant, un static_cast suivi d'un dynamic_cast, ça me semble imprévisible si le static_cast n'est pas correct, c'est à dire si on ne sait pas du tout de quel type est l'argument.
    pourtant tout le but de mon opération est d'arriver à détecter les cas ou le cast n'aurait pas été valide, de m'assurer que arg était de type MyTest avant d'etre un paramètre void *
    (c'est pas bien les void* )
    le prototype de la fonction est imposé malheuresement, c'est bien pour ca que j'essaye de retrouver le type de départ avec certitude :-)
    Il te faudra donc faire un static_cast vers un objet acceptable avant de le tester par dynamic_cast
    je pensais que ca revenait au meme que mon tout premier cast sur arg, mais meme apres essai, avec static_cast ca ne change rien apparament...
    Explication lue dans le livre de stroustrup:
    le compilateur ne peut emettre aucune hypotheses concernant la mémoire pointée par un void * ,cela implique que dynamic_cast qui doit examiner l'objet pour en determiner le type ne peut effectuer une conversion à partir d'un void * .
    argh, ben je pensais que la toute-puissance du dynamic_cast me permettrait d'arriver à mes fins... y a une autre méthode que ça du coup?

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    De toute manière un void* en C++ est à éviter. Mieux vaut passer un pointeur vers une classe mère, on aura moins de soucis et un design un peu meilleur.

  10. #10
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    ok merci

  11. #11
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Finalement j'ai remplacé le void * par un type abstrait dont tous les objets susceptibles d'être passés en paramètre héritent.
    Bon c'est pas terrible vu que du coup, presque toutes les classe du projet héritent de la classe abstraite en question, mais au moins le dynamic_cast fonctionne...
    merci Miles ;-)

  12. #12
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement c'est pas terrible comme design.

    Quel est le rôle de cette fonction ? Tu ne peux pas plutôt utiliser les templates ? Ou la surcharge ?

    Sinon tu peux aussi passer un identifiant avec ton void*, c'est généralement ce qui se fait en C.

    Au pire tu peux également utiliser boost::any et boost::any_cast, ça t'évitera de faire dériver toutes tes classes d'une base qui ne sert finalement à rien.

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

Discussions similaires

  1. [Binaire] Opérateurs de rotation dee bits ?
    Par Tifauv' dans le forum C
    Réponses: 3
    Dernier message: 09/11/2017, 11h29
  2. Opérateur de statistique
    Par Phil951 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/01/2004, 15h12
  3. Opérateur like
    Par Troopers dans le forum ASP
    Réponses: 3
    Dernier message: 15/09/2003, 19h19
  4. opérateur non applicable à ce type d'opérande
    Par Amon dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2003, 18h07
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22

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