Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1046 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [visual c++]dynamic_cast

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[visual c++]dynamic_cast

n°1120769
AsTro
Posté le 15-06-2005 à 14:01:00  profilanswer
 

Salut,
J'ai deux classes qui s'appelle Category et Component qui héritent toutes les deux de la classe AbstractCat.
Je créé des objets Category et Component.
Plus loin dans le programme je les récupère sous forme de d'objets AbstractCat et j'aimerais donc les caster pour effectuer des opérations différentes selon que les objets sont des Category ou des Component.
Le problème est que mon dynamic_cast fait freezer le programme. Si je le termine, le debugger pointe dans le fichier dbgheap.c dans le malloc de la fonction : "_CRTIMP void * __cdecl malloc".
Et j'ai le message d'erreur suivant :
Unhandled exception at 0x77e738b2 in GetInfo.exe: Microsoft C++ exception: __non_rtti_object @ 0x0012f010.
 
Si je fais un dynamic_cast d'une Category vers une AbstractCat ca passe, mais pas l'inverse :(
 
Exemple de code qui ne marche pas:
 

Code :
  1. AbstractCat *abs = new AbstractCat("test" );
  2. if(Category *comp = dynamic_cast<Category*>(abs))
  3. CEditCtrl.SetWindowText("Category" );
  4. else
  5. CEditCtrl.SetWindowText("Other" );


 
Par contre ca, ca marche :
 

Code :
  1. Category *cat = new Category("test" );
  2. if(AbstractCat *comp = dynamic_cast<AbstractCat*>(cat))
  3. CEditCtrl.SetWindowText("AbstractCat" ); //ca passe forcément ici
  4. else
  5. CEditCtrl.SetWindowText("Other" );


 
 
En fait c'est le downcast qui ne passe pas, mais pourquoi?


Message édité par AsTro le 15-06-2005 à 14:02:58
mood
Publicité
Posté le 15-06-2005 à 14:01:00  profilanswer
 

n°1120793
AsTro
Posté le 15-06-2005 à 14:17:02  profilanswer
 

J'ai lu un truc sur le net, comme quoi il y a ambiguïté si dans l'objet à caster coexistent plusieurs objets de meme type:

Lors d'un transtypage, aucune ambiguïté ne doit avoir lieu pendant la recherche dynamique du type. De telles ambiguïtés peuvent apparaître dans les cas d'héritage multiple, où plusieurs objets de même type peuvent coexister dans le même objet. Cette restriction mise à part, l'opérateur dynamic_cast est capable de parcourir une hiérarchie de classe aussi bien verticalement (convertir un pointeur de sous-objet vers un pointeur d'objet complet) que transversalement (convertir un pointeur d'objet vers un pointeur d'un autre objet frère dans la hiérarchie de classes).


 
Mon AbstractCat est en fait un heritage de vector<AbstractCat *>.
Est-ce que ca explique mon bug?
Si c'est bien ca, comment je fais pour downcaster alors?


Message édité par AsTro le 15-06-2005 à 14:17:29
n°1120798
chrisbk
-
Posté le 15-06-2005 à 14:18:52  profilanswer
 

heuh bin : __non_rtti_object
 
visiblement y'a une couille la, dynamic cast se basant justement sur le RTTI...

n°1120802
AsTro
Posté le 15-06-2005 à 14:22:41  profilanswer
 

chrisbk a écrit :

heuh bin : __non_rtti_object
 
visiblement y'a une couille la, dynamic cast se basant justement sur le RTTI...


 
 
Et c'est quoi RTTI?

n°1120806
chrisbk
-
Posté le 15-06-2005 à 14:23:57  profilanswer
 

Run Time Type Information. ah bin tiens, tu me fais penser, c'est un truc qu'il faut activer dans les options de VS (je sais pas si c'est mis par defaut)
 
regarde voir dans projects->option->C/C++->code generation ? (ou si c'est pas la, fouille un peu)

n°1120816
AsTro
Posté le 15-06-2005 à 14:29:28  profilanswer
 

Ok merci je viens de trouver.
Il faut activer le RTTI.
Project->Settings->C/C++->language->Enable RTTI
 
Mais pourquoi ce n'est pas activé par défaut? Y'a des risques a l'activer?


Message édité par AsTro le 15-06-2005 à 14:39:26
n°1120818
chrisbk
-
Posté le 15-06-2005 à 14:32:04  profilanswer
 

doit avoir un surcout en mémoire

n°1121135
mynab
Posté le 15-06-2005 à 17:34:56  profilanswer
 

En plus MFC implémente un mécanisme similaire (DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC). Cela explique pourquoi ça n'est pas activé par défaut...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [visual c++]dynamic_cast

 

Sujets relatifs
OpenGl dans une fenêtre définie avec visual .Net[Visual C++/MFC] Redimensionnement
[Visual C++]TemplateVisual Studio .NET pro & entreprise
[Apprenti Programmeur] Je Recherche UnTutorial Pour Visual C++ 2005[Visual C++] Recherche un équivalent de popen
[Visual C++]Application MultilinguePlusieurs questions en visual asic
Visual Studio 6 et Visual Studio .Net sur la meme machine ?VB6 débutant : besoin daide ou de piste..!
Plus de sujets relatifs à : [visual c++]dynamic_cast


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR