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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] pb de dynamic cast

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[C++] pb de dynamic cast

n°850084
Eugenics
Posté le 14-09-2004 à 16:43:48  profilanswer
 

Salut tout le monde,
 
  Voici mon probleme,  
 
 
d'un coté j'ai :
 
jai une classe Individus  
une classe InidividusMouvant derivant de Individus
 
d'un autre j'ai:
 
une classe Modele qui contiens un vecteur de pointeurs sur individus
une classe ModeleCourant derivant de Modele ou la j'initialise le vecteir sur individus a coup de new IndividusMouvant  
 
la classe Modele ontiens une methode virtual Evaluer(IndividusMouvant &i)
la classe ModeleCourant elle contiens la meme mais en non virtuelle :p
 
 
 
moi je veux appeler ma methode Evaluer de modeleCourant.
doncje fais un new modele courant, hop !  
jje fais un new de individusMouvant , hop!
 
et la quand je fais Evaluer(un_individus) il me pete une durite car un_individus est de typ Individus (car a l'orrigine c'est un vecteur sur individus .....
 
comment faire pour lui faire comprendre que non ce n'est plus du type individus, mais individus_mouvant  ??


Message édité par Eugenics le 16-09-2004 à 22:20:39
mood
Publicité
Posté le 14-09-2004 à 16:43:48  profilanswer
 

n°850096
Lam's
Profil: bas.
Posté le 14-09-2004 à 16:57:24  profilanswer
 

Tu nous as décrit une solution java là ;-).
 
La solution C++ :  
la classe Modele ne définit pas de vector : elle se contente de dire qu'il est possible d'obtenir un individu en fonction de son nom, de sa position, etc. Tu peux même définir ta propre classe d'itérateur. A charge aux classes dérivées de définir le container (vector spécialisé, etc.)
 
Ma solution:  
Tu gardes ton code tel quel, tu fais un dynamic_cast sur chaque objet de ta collection, et tu lèves une exception si le pointeur retourné vaut 0..

n°850097
Eugenics
Posté le 14-09-2004 à 16:58:57  profilanswer
 

Lam's a écrit :

Tu nous as décrit une solution java là ;-).
 
La solution C++ :  
la classe Modele ne définit pas de vector : elle se contente de dire qu'il est possible d'obtenir un individu en fonction de son nom, de sa position, etc. Tu peux même définir ta propre classe d'itérateur. A charge aux classes dérivées de définir le container (vector spécialisé, etc.)
 
Ma solution:  
Tu gardes ton code tel quel, tu fais un dynamic_cast sur chaque objet de ta collection, et tu lèves une exception si le pointeur retourné vaut 0..


 
heu pourrais tu me preciser ce que c'est en detail un dynamic cast?

n°850104
Lam's
Profil: bas.
Posté le 14-09-2004 à 17:04:48  profilanswer
 

Eugenics a écrit :

heu pourrais tu me preciser ce que c'est en detail un dynamic cast?


 
Tu habites en Chine, ou bien c'est ton FAI qui t'empêche d'utiliser google  
 :D  

n°850116
Eugenics
Posté le 14-09-2004 à 17:16:25  profilanswer
 

nop mais bon auttant demander directement ;) comme ca  hop le gars qui viens apres a pas besoin de se tapper le google ;) (une recherche dynamic cast->il arrive ici et hop il trouve une explication au lieur de trouver man google;) )  
 
bon oki je vais aller googler :p  
hop !! :p

n°850121
jagstang
Pa Capona ಠ_ಠ
Posté le 14-09-2004 à 17:18:09  profilanswer
 

raté, c'est pas comme cela que fonctionne ce forum...
 
 

Citation :

 
[0A.1] Certaines questions simples peuveut se résoudre via une simple recherche.
 
    * Sur Google : http://www.google.com ou http://groups.google.com.
    * N'oubliez pas non plus de consulter la documentation accompagnant votre environnement de développement/compilateur.


 
 
http://forum.hardware.fr/forum2.ph [...] 544&cat=10

n°850138
Lam's
Profil: bas.
Posté le 14-09-2004 à 17:41:46  profilanswer
 

Eugenics a écrit :

une recherche dynamic cast->il arrive ici


 
dynamic_cast, avec un underscore.

n°850178
Ruffi
Posté le 14-09-2004 à 19:22:49  profilanswer
 

Sinon, tu fait un petit cast :
Objet.Evaluer( (IndividusMouvant*) un_individus);
 
On m'a dit sur un forum que dynamic_cast est une methode pas propre, utilisé quand les classes sont mal concus.
On m'aurait menti ????

n°850180
Taz
bisounours-codeur
Posté le 14-09-2004 à 19:26:47  profilanswer
 

oui. c'est des abrutis qui ont rien compris qui t'ont dit ça. dynamic_cast est fondamental.
 
 
dans ton exemple d'ailleurs il sert à quoi le cast ?.

n°850195
chrisbk
-
Posté le 14-09-2004 à 19:39:56  profilanswer
 

Taz a écrit :

oui. c'est des abrutis qui ont rien compris qui t'ont dit ça. dynamic_cast est fondamental.


 
je plussoie, et si tu (Ruffi) veux etre convaincu j'ai ici un exemple prouvant qu'il l'est.

mood
Publicité
Posté le 14-09-2004 à 19:39:56  profilanswer
 

n°850374
Ruffi
Posté le 14-09-2004 à 23:27:15  profilanswer
 

Avec plaisir :)
Parsqu'en fait, suite à ça; j'ai oublié a quoi sa servait pour justement ne pas l'utiliser...


Message édité par Ruffi le 14-09-2004 à 23:35:53
n°850381
chrisbk
-
Posté le 14-09-2004 à 23:37:26  profilanswer
 

Ruffi a écrit :

Avec plaisir :)
Parsqu'en fait, suite à ça; j'ai oublié a quoi sa servait pour justement ne pas l'utiliser...


 
Smon exemple favori. Bon, ce genre de cas est pas trop censé arrivé, mais ca montre la faiblesse du cast "C" dans certaines conditions (ici, ok, c'est un brin chelou, mais bon)
 

Code :
  1. class Truc
  2. {
  3. public:
  4. virtual void prout()
  5. {
  6.  std::cout<<"prout\n";
  7. }
  8. };
  9. class Machin
  10. {
  11. public:
  12. virtual void roger()
  13. {
  14.  std::cout<<"roger\n";
  15. }
  16. };
  17. class Bidule : public Truc, Machin
  18. {
  19. };
  20. void main()
  21. {
  22. Bidule * bidule = new Bidule(); // on fait un bidule
  23. Truc   * tr = (Truc *)bidule;   // bidule etant aussi un Truc,
  24.         //on peut le caster, n'est ce pas ?
  25. Machin * mc = (Machin *) tr;    // d'accord, Truc n'est pas un Machin, mais finalement,
  26.         // le type reel de notre "Truc"
  27.         // c'est "Bidule" et "Bidule" est aussi un machin. Logique, non ?
  28. mc->roger();  //de facon tres interessante,
  29.      //on ne verra pas "roger" a l'ecran, mais "prout".
  30.         //avec RTTI et dynamic cast, ca affiche bien "roger"
  31. }


Message édité par chrisbk le 14-09-2004 à 23:38:24
n°850388
Taz
bisounours-codeur
Posté le 14-09-2004 à 23:46:20  profilanswer
 

le truc c'est déjà que le premier cast est inutile
 
ton exemple, il est vachement intéressant, m'étonnerait pas que sur certaines arch, il segfault carrément :D

n°850395
chrisbk
-
Posté le 14-09-2004 à 23:54:17  profilanswer
 

Taz a écrit :

le truc c'est déjà que le premier cast est inutile


 
non justement, sans, ca marcherait, vu qu'il saura faire le deplacement nécéssaire  pour retomber sur "Machin". La, de Truc a Machin, il sait pas, donc il fait rien, et il reste en fait sur "Truc".
 
ah ouais nan, laisse tber, j'ai compris, j'ai rien dit


Message édité par chrisbk le 14-09-2004 à 23:56:07
n°850399
Taz
bisounours-codeur
Posté le 15-09-2004 à 00:00:18  profilanswer
 

héhé :D

n°850403
chrisbk
-
Posté le 15-09-2004 à 00:05:51  profilanswer
 

oué enfin tu pinailles hein ? [:joce]

n°850408
Taz
bisounours-codeur
Posté le 15-09-2004 à 00:11:47  profilanswer
 

euh non, le cast inutile, j'ai horreur de ça comme tu sais
 
y a pas à caster Bidule est un Truc

n°850410
Ruffi
Posté le 15-09-2004 à 00:15:41  profilanswer
 

Oki, je vois...
Mais pour l'instant j'ai jamais eu vraiment besoin de l'utiliser.
Mais ,je le garde dans un coin de ma tete au cas où :)

n°850411
Taz
bisounours-codeur
Posté le 15-09-2004 à 00:17:18  profilanswer
 

surtout n'utilise jamais les cast C (Machin *)

n°850413
chrisbk
-
Posté le 15-09-2004 à 00:19:11  profilanswer
 

Taz a écrit :

euh non, le cast inutile, j'ai horreur de ça comme tu sais
 
y a pas à caster Bidule est un Truc


 
j'ose pas le jeter sinon j'vais avoir tom hanks a domicile
 
(un mars pour qui comprends ce lamentable jeu de mot)


Message édité par chrisbk le 15-09-2004 à 00:20:29
n°850420
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 15-09-2004 à 00:32:51  profilanswer
 

chrisbk a écrit :

j'ose pas le jeter sinon j'vais avoir tom hanks a domicile
 
(un mars pour qui comprends ce lamentable jeu de mot)


http://www.jnpp.ee/dvd/Pildid/DVD%20PILDID/Cast%20Away.jpg
 
J'veux mon Mars :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°850422
Ruffi
Posté le 15-09-2004 à 00:39:30  profilanswer
 

Je suis nouveau sur ce forum.
J'aime bien cette ambiance de blague bien pouris  :pt1cable: (en plus, vous vous y connaissez super bien en prog !!  :) )
 

n°850423
Eugenics
Posté le 15-09-2004 à 00:40:56  profilanswer
 

le dimaic cast a effectivement reslolus mon pb ;) merci :p bien

n°850430
chrisbk
-
Posté le 15-09-2004 à 00:48:37  profilanswer
 

je crains d'etre meilleur en calembour grotesque qu'en prog [:petrus75]
 
taiche : je note ta victoire [:petrus75]

n°850436
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 15-09-2004 à 00:55:04  profilanswer
 

chrisbk a écrit :


taiche : je note ta victoire [:petrus75]


Tu l'as notée combien ? [:kbchris]


Message édité par Taiche le 15-09-2004 à 00:55:13

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°850438
chrisbk
-
Posté le 15-09-2004 à 00:56:06  profilanswer
 

Taiche a écrit :

Tu l'as notée combien ? [:kbchris]


 
10/10 pour le petit taiche [:petrus75]
elle est ou ta mamaaannn ? et il fait quoi ton papaaaaa ?

n°850441
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 15-09-2004 à 00:59:25  profilanswer
 

\o/ J'vais avoir un bon point en plusse du Mars ? http://www.microserfs.net/HFR/petrus/lovetounet.gif
Ma maman elle est là-bas ; mon papa il est motard http://www.microserfs.net/HFR/petrus/petrusfuck.gif


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°850443
chrisbk
-
Posté le 15-09-2004 à 01:00:58  profilanswer
 

que c'est miggnooooon [:icon7] (ta gueule pti con, prends ton lego tout pourri et degage, j'ai rencard avec evelyne thomas)

n°850770
frenchkiss
Posté le 15-09-2004 à 14:32:17  profilanswer
 

tu aurais tres bien plus aussi implementer un  
design pattern de type visiteur.
 
FK
 
 
 

n°850783
Lam's
Profil: bas.
Posté le 15-09-2004 à 14:54:09  profilanswer
 

frenchkiss a écrit :

tu aurais tres bien plus aussi implementer un  
design pattern de type visiteur.
 
FK


 
Fiston, ceci n'est pas un problème de double-dispatch : c'est juste du polymorphisme de chez mémé... Il n'y a donc pas besoin de visiteur (ça serait même contre-indiqué).
Et l'anti-pattern est aussi bon que le pattern, si ce n'est plus...

n°850871
frenchkiss
Posté le 15-09-2004 à 17:01:24  profilanswer
 

Citation :

Et l'anti-pattern est aussi bon que le pattern, si ce n'est plus...


ouai ok je vois le niveau de la bete.
[:arrakis99] [:nicolas89]
 
dynamic_cast ne resouds pas les problemes de conception / design.
 
techniquement effectivement ca va marcher.
 
mais d'un point de vue conception il y a deja des trucs louches avant  
 
- la relation entre individus mouvant et individus est  suspecte
- le modele et modele mouvant l est tout autant
- le modele cree il reellement les individus ou c'etait juste pour (rigoler) l'exemple?
 
un individu non mouvant ne pourra t-il jamais "mouver" .. penses tu avec ce choix actuel de design devoir a gerer la consistence entre les vecteur de plusieurs modele? vu que stricto censu un individus mouvant EST un individus alors il devra se trouver dans modele ET modele mouvant
 
ou autrement:
 
la classe modele a une methode evaluer(IndividusMouvant..) en a t elle une aussi evaluer( individus ..)
dans ce cas ton ideee etait elle de creer un modele et un modeleCourant  
juste pour pouvoir apeller plus smimplemeent l'evaluer? ( et faire un evaluer sur chacun des elements de ton vecteur)
 
et la je pense que l on parle de conception.
 
FK

n°850907
Lam's
Profil: bas.
Posté le 15-09-2004 à 17:37:56  profilanswer
 

frenchkiss a écrit :

Citation :

Et l'anti-pattern est aussi bon que le pattern, si ce n'est plus...


ouai ok je vois le niveau de la bete.
[:arrakis99] [:nicolas89]
 
dynamic_cast ne resouds pas les problemes de conception / design.
 


 
Il y a clairement un problème de conception dans son truc, on est d'accord. Comme je l'ai souligné dans mon message initial (le 2ème de la discussion), il aurait fallu que le container ne soit pas défini dans la classe de base. Pour les cas un peu spéciaux, on peut même définir une hierarchie d'itérateurs (c'est à dire un itérateur sur individus, ou un itérateur sur seulement les individus mouvants, qui lui fera du dynamic_cast du type TypedIterator).
 
 
Mais je reste sur mon opinion qu'il n'y a pas de problème de double-dispatch ici. Il ne cherche qu'à faire du polymporphisme sur la mobilité des individus. Donc le visitor n'est pas le bienvenu ici.  
 
Quand à l'anti-pattern, je pensait à toute la discussion dans l'article 31 de More Effective C++ de Scott Meyers, et non à l'utilisation béate de dynamic_cast. Pour avoir vu des projets mourir sous le poids des visitors, visited, etc, j'essaye d'éviter tant que je le peux.


Message édité par Lam's le 15-09-2004 à 17:39:13
n°850929
frenchkiss
Posté le 15-09-2004 à 18:04:07  profilanswer
 

Iterator ou Vitisteur c'est trop liée a son probleme pour choisir je ne peux pas etre aussi categorique que toi .  
Tout en penchant tout de meme beaucoup plus sur le visitor.
 
Et ... l'iterator est aussi un design pattern .
 
FK
 
 
 

n°852141
Eugenics
Posté le 16-09-2004 à 21:58:55  profilanswer
 

frenchkiss a écrit :

Citation :

Et l'anti-pattern est aussi bon que le pattern, si ce n'est plus...


ouai ok je vois le niveau de la bete.
[:arrakis99] [:nicolas89]
 
dynamic_cast ne resouds pas les problemes de conception / design.
 
techniquement effectivement ca va marcher.
 
mais d'un point de vue conception il y a deja des trucs louches avant  
 
- la relation entre individus mouvant et individus est  suspecte
- le modele et modele mouvant l est tout autant
- le modele cree il reellement les individus ou c'etait juste pour (rigoler) l'exemple?
 
un individu non mouvant ne pourra t-il jamais "mouver" .. penses tu avec ce choix actuel de design devoir a gerer la consistence entre les vecteur de plusieurs modele? vu que stricto censu un individus mouvant EST un individus alors il devra se trouver dans modele ET modele mouvant
 
ou autrement:
 
la classe modele a une methode evaluer(IndividusMouvant..) en a t elle une aussi evaluer( individus ..)
dans ce cas ton ideee etait elle de creer un modele et un modeleCourant  
juste pour pouvoir apeller plus smimplemeent l'evaluer? ( et faire un evaluer sur chacun des elements de ton vecteur)
 
et la je pense que l on parle de conception.
 
FK


 
re bonjour tout le monde, je vois que je m'en suis pris plein la caftiere mais bon tant pis.
 
me revoila avec mon dynamic cast apres avoir modifié pas mal de chose je me retrouve a faire ceci  
 

Code :
  1. Individu *indv = _population.Get_Ptrindividu(i);
  2. indv->Set_malus(10);
  3. IndividuMouvant *indivM;
  4. if((indivM = dynamic_cast <IndividuMouvant *>(indv)) != NULL)
  5. {
  6. _modele->Evalue(*indivM);
  7. }


 
a la compil ca passe mais
le dynamic cast renvoie toujours NULL :/  
 
 
 
apres au niveau conception c'est mon reele 1er projet en CPP ou je me force a faire du vrais cpp et non  un pseudo cpp qui au final resemble plus a du c donc effectivement il dois y avoir des chose pas tres bon en conception ...  
si j'ai le temps je posterais un petit uml maison pour que vous puissiez voir et me dire ce qu'il faudrais que j'ameliore
 
pour les trucs louches  
 
- Individus mouvant herite de la classe Individus  (normal un individu mouvant c'est avant tout un individu)  
 
- Modele est simplement une classe pour evaluer mes individus et faire des operation sur des individus , cette classe est derive en une classe Donjon qui comporte des evaluation d'indivudus, d'individus mouvant ...  
 
- le modele ne cree pas les individus  !!!  il sert simplement a les evaluer, donc d'un coté jai ma population, d'un autre mon modele, et quand je veux evaluer ma population, hop j'apelle la fonction evalue de modele, avec en param la population ...

n°852151
chrisbk
-
Posté le 16-09-2004 à 22:07:25  profilanswer
 

(tu veux pas changer le titre du topic ? a chaque fois je lis "probleme de contraception" [:boidleau])

n°852173
Eugenics
Posté le 16-09-2004 à 22:21:00  profilanswer
 

chrisbk a écrit :

(tu veux pas changer le titre du topic ? a chaque fois je lis "probleme de contraception" [:boidleau])

c'est bon :p

n°852184
LeGreg
Posté le 16-09-2004 à 22:31:03  profilanswer
 

ta population c'est un tableau d'individus ou de pointeurs d'individus ?
 

n°852185
Eugenics
Posté le 16-09-2004 à 22:32:51  profilanswer
 

ma population  
 
c'est un vector<Individu>  
 
car jai eut des surprises avec l'algo de sort :/ et des fuites de mem incomprehensibles (pour moi) et donc je me suis dis hop ! je transforme mon vecteur sur pointeurs d'individus, en vecteur sur individus comme ca mon sort nikel et ma desalocation aussi.


Message édité par Eugenics le 16-09-2004 à 22:38:55
n°852211
LeGreg
Posté le 16-09-2004 à 23:00:40  profilanswer
 

tu as la réponse alors
comme ce sont des individus, tu ne peux pas caster leurs pointeurs en individus_mouvants..
 

n°852219
Eugenics
Posté le 16-09-2004 à 23:09:17  profilanswer
 

jai pas le drois de faire  
 
Individu *i = &(VecteurIndividus[i]);
et ensuite basta?  
 
de mem alors comment je peux faire pour lui faire comprendre que mon individu est un idividuMouvant a ma fonction evalue ??
 
car dynamic_cast caste que des pointeurs ??

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  [C++] pb de dynamic cast

 

Sujets relatifs
creation dynamic de PDF à partir d'un fichier Word sur un serveur iis?[javascript]tableau dynamic
probleme de cast :!Cast Image->BufferedImage après un Toolkit.getImage
cast de tquery[ClassLoader][Cast] pb de cast - 2 ClassLoader différents
probleme pointeur void alors qu'un cast de char* marche :\[Résolu] Pb de cast à partir d'un Object
[resolu]cast de composant graphique[C] cast d'un void*
Plus de sujets relatifs à : [C++] pb de dynamic cast


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)