pb de dynamic cast [C++] - C++ - Programmation
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..
Marsh Posté le 14-09-2004 à 16:58:57
Lam's a écrit : Tu nous as décrit une solution java là ;-). |
heu pourrais tu me preciser ce que c'est en detail un dynamic cast?
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
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
hop !!
Marsh Posté le 14-09-2004 à 17:18:09
raté, c'est pas comme cela que fonctionne ce forum...
Citation : |
http://forum.hardware.fr/forum2.ph [...] 544&cat=10
Marsh Posté le 14-09-2004 à 17:41:46
ReplyMarsh 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 ????
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 ?.
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.
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...
Marsh Posté le 14-09-2004 à 23:37:26
Ruffi a écrit : Avec plaisir |
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 :
|
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
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
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
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ù
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 |
j'ose pas le jeter sinon j'vais avoir tom hanks a domicile
(un mars pour qui comprends ce lamentable jeu de mot)
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 |
J'veux mon Mars
Marsh Posté le 15-09-2004 à 00:39:30
Je suis nouveau sur ce forum.
J'aime bien cette ambiance de blague bien pouris (en plus, vous vous y connaissez super bien en prog !! )
Marsh Posté le 15-09-2004 à 00:40:56
le dimaic cast a effectivement reslolus mon pb merci bien
Marsh Posté le 15-09-2004 à 00:48:37
je crains d'etre meilleur en calembour grotesque qu'en prog
taiche : je note ta victoire
Marsh Posté le 15-09-2004 à 00:55:04
chrisbk a écrit : |
Tu l'as notée combien ?
Marsh Posté le 15-09-2004 à 00:56:06
Taiche a écrit : Tu l'as notée combien ? |
10/10 pour le petit taiche
elle est ou ta mamaaannn ? et il fait quoi ton papaaaaa ?
Marsh Posté le 15-09-2004 à 00:59:25
\o/ J'vais avoir un bon point en plusse du Mars ?
Ma maman elle est là-bas ; mon papa il est motard
Marsh Posté le 15-09-2004 à 01:00:58
que c'est miggnooooon (ta gueule pti con, prends ton lego tout pourri et degage, j'ai rencard avec evelyne thomas)
Marsh Posté le 15-09-2004 à 14:32:17
tu aurais tres bien plus aussi implementer un
design pattern de type visiteur.
FK
Marsh Posté le 15-09-2004 à 14:54:09
frenchkiss a écrit : tu aurais tres bien plus aussi implementer un |
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...
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.
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
Marsh Posté le 15-09-2004 à 17:37:56
frenchkiss a écrit :
|
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.
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
Marsh Posté le 16-09-2004 à 21:58:55
frenchkiss a écrit :
|
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 :
|
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 ...
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" )
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" ) |
c'est bon
Marsh Posté le 16-09-2004 à 22:31:03
ta population c'est un tableau d'individus ou de pointeurs d'individus ?
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.
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..
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 ??
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
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