[C++] pb de dynamic cast

pb de dynamic cast [C++] - C++ - Programmation

Marsh Posté le 14-09-2004 à 16:43:48    

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
Reply

Marsh Posté le 14-09-2004 à 16:43:48   

Reply

Marsh Posté le 14-09-2004 à 16:57:24    

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..

Reply

Marsh Posté le 14-09-2004 à 16:58:57    

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?

Reply

Marsh Posté le 14-09-2004 à 17:04:48    

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  

Reply

Marsh Posté le 14-09-2004 à 17:16:25    

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

Reply

Marsh Posté le 14-09-2004 à 17:18:09    

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

Reply

Marsh Posté le 14-09-2004 à 17:41:46    

Eugenics a écrit :

une recherche dynamic cast->il arrive ici


 
dynamic_cast, avec un underscore.

Reply

Marsh Posté le 14-09-2004 à 19:22:49    

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 ????

Reply

Marsh Posté le 14-09-2004 à 19:26:47    

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 ?.

Reply

Marsh Posté le 14-09-2004 à 19:39:56    

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.

Reply

Marsh Posté le 14-09-2004 à 19:39:56   

Reply

Marsh Posté le 14-09-2004 à 23:27:15    

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
Reply

Marsh Posté le 14-09-2004 à 23:37:26    

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
Reply

Marsh Posté le 14-09-2004 à 23:46:20    

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

Reply

Marsh Posté le 14-09-2004 à 23:54:17    

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
Reply

Marsh Posté le 15-09-2004 à 00:00:18    

héhé :D

Reply

Marsh Posté le 15-09-2004 à 00:05:51    

oué enfin tu pinailles hein ? [:joce]

Reply

Marsh Posté le 15-09-2004 à 00:11:47    

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

Reply

Marsh Posté le 15-09-2004 à 00:15:41    

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ù :)

Reply

Marsh Posté le 15-09-2004 à 00:17:18    

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

Reply

Marsh Posté le 15-09-2004 à 00:19:11    

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
Reply

Marsh Posté le 15-09-2004 à 00:32:51    

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.
Reply

Marsh Posté le 15-09-2004 à 00:39:30    

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 !!  :) )
 

Reply

Marsh Posté le 15-09-2004 à 00:40:56    

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

Reply

Marsh Posté le 15-09-2004 à 00:48:37    

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

Reply

Marsh Posté le 15-09-2004 à 00:55:04    

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.
Reply

Marsh Posté le 15-09-2004 à 00:56:06    

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 ?

Reply

Marsh Posté le 15-09-2004 à 00:59:25    

\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.
Reply

Marsh Posté le 15-09-2004 à 01:00:58    

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

Reply

Marsh Posté le 15-09-2004 à 14:32:17    

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

Reply

Marsh Posté le 15-09-2004 à 14:54:09    

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...

Reply

Marsh Posté le 15-09-2004 à 17:01:24    

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

Reply

Marsh Posté le 15-09-2004 à 17:37:56    

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
Reply

Marsh Posté le 15-09-2004 à 18:04:07    

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
 
 
 

Reply

Marsh Posté le 16-09-2004 à 21:58:55    

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 ...

Reply

Marsh Posté le 16-09-2004 à 22:07:25    

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

Reply

Marsh Posté le 16-09-2004 à 22:21:00    

chrisbk a écrit :

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

c'est bon :p

Reply

Marsh Posté le 16-09-2004 à 22:31:03    

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

Reply

Marsh Posté le 16-09-2004 à 22:32:51    

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
Reply

Marsh Posté le 16-09-2004 à 23:00:40    

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

Reply

Marsh Posté le 16-09-2004 à 23:09:17    

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 ??

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed