dynamic_cast... [c++] - Programmation
Marsh Posté le 21-01-2002 à 15:35:06
logiquement, ça:
Code :
|
devrait passer sans pb...
Marsh Posté le 21-01-2002 à 15:39:23
de rien.
J'parle; g jammais utilisé ce truc, ms ça parait logique.
c quoi l'intéret de ça par rapport à un cast "normal" ?
style :
Code :
|
tu connaissais ça !?
[edtdd]--Message édité par El_Gringo--[/edtdd]
Marsh Posté le 21-01-2002 à 15:43:17
ben en fait j'ai
class A
class B : public A
{
int data();
}
class C : public A
{
string data();
}
et apparement, il faut employer dynamic_cast
parce que data() n'existe pas dans A
sinon, suffit de mettre virtual data() dans A (je crois)
enfin, je sais pas si je dis des conneries, mais c'est ce que j'ai compris
Marsh Posté le 21-01-2002 à 15:55:59
Bah oui, mais le pb, c que, c pas juste en castant A* en B* que tu vas mettre des données dans ce vers quoi pointe pTaClasse.
je suis curieux de voir ce qu'y se passe qd tu fais le:
cout << ((B*)pTaClasse)->data();
Le cast, ça peut foutre une merde pas possible si c mal utilisé.
Tu peut toujours caster une classe en n'importe quelle classe dont elle hérite (directement ou non)
par exemple, dans ton cas, tu peut caster B en A, ou C en A, sans pb.
Par contre, pour caster un pointeur vers un objet de type A en un pointant sur un objet de type B, il faut que l'objet pointé par le pointeur de type A soit en fait un objet de type B...
oula... embrouillé tt ça...dsl
Marsh Posté le 21-01-2002 à 16:03:45
arrete de m'embrouiller euh
bong, je te donne mon programme et t'as qu'à voir:
Code :
|
il faut aussi faire un fichier [i]sys.log avec ca dedans :
0;frodon;3.76;36
0;aragorn;4.37;42
1;bilbon;2.76;test.dat
0;sauron;8.32;41
1;saroumane;7.75;mechant.dat
1;gandalf;7.37;gentil.dat
0;legolas;5.25;54
0;gimli;4.32;22
1;boromir;2.83;hom.dat
0;elrond;5.13;12
ps : bong, j'ai fait ca comme une tache, mais je sais pas programmer, alors voili
pps : en fait oui, ca doit être parce que c'est des pointeurs vers des classes dérivées qu'il faut dynamic_caster...
mais bong, le monsieur il a dit de dynamic_cast alors je dynamic_cast
Marsh Posté le 21-01-2002 à 16:09:41
...quel monsieur !?
g pas le temps de lire tout ton listing là, désolé !
Mais essaye, tu verras bien si ça marche.
Marsh Posté le 21-01-2002 à 16:35:23
ben ca marche.
c'était juste pour essayer de répondre à ta question...
le monsieur, c'est le monsieur qui me donne cours. Enfin, qui aurait dû me donner cours parce que je suis arrivé avec quelques mois de retard
enfin bong, ca marche, c'est le principal.
Pour la théorie, je capte rieng. Alors je teste en mettant une étoile ici, puis je le mets ailleurs si ca marche pas, ... , et si ca ne marche toujours pas, je demande ici
voili
Marsh Posté le 21-01-2002 à 17:03:35
El_Gringo a écrit a écrit : J'parle; g jammais utilisé ce truc, ms ça parait logique. c quoi l'intéret de ça par rapport à un cast "normal" ? |
Soit classe B : public A
le cast normal B* b =(B*) a;
est un maquillage qui sert juste a faire taire le compilateur
quand il s'agit de pointeurs (sinon il refusera quand meme
de faire des casts de types incompatibles a la compilation).
Mais cela suppose que la personne sait ce qu'elle fait;
c'est a dire qu'elle sait que 'a' pointe vers un objet de type 'B' a l'execution ce qui n'est pas evident dans ton exemple.
le dynamic_cast est plus safe. C'est a dire qu'avant de te rendre
ton pointeur vers un objet de type B elle verifiera au préalable que 'a' est bien de type 'B' (grace aux informations de types).
Sinon elle levera une exception. (Bad_cast).
A+
LEGREG
Marsh Posté le 21-01-2002 à 17:05:25
legreg a écrit a écrit : Soit classe B : public A le cast normal B* b =(B*) a; est un maquillage qui sert juste a faire taire le compilateur quand il s'agit de pointeurs (sinon il refusera quand meme de faire des casts de types incompatibles a la compilation). Mais cela suppose que la personne sait ce qu'elle fait; c'est a dire qu'elle sait que 'a' pointe vers un objet de type 'B' a l'execution ce qui n'est pas evident dans ton exemple. le dynamic_cast est plus safe. C'est a dire qu'avant de te rendre ton pointeur vers un objet de type B elle verifiera au préalable que 'a' est bien de type 'B' (grace aux informations de types). Sinon elle levera une exception. (Bad_cast). A+ LEGREG |
Ok, merci pour cet éclaircissemment.
Marsh Posté le 21-01-2002 à 17:16:33
art_dupond a écrit a écrit : parce que data() n'existe pas dans A sinon, suffit de mettre virtual data() dans A (je crois) |
non il ne suffit pas de mettre virtual parce que
tes deux fonctions n'ont pas la meme signature
B::data() renvoie un int
et C::data() renvoie un string.
Il n'y a pas d'autre solution que de caster lors de l'execution.
il faut compiler en precisant que tu veux les RTTI (runtime type information) et evidemment catcher les exceptions ou verifier le type avant de faire ton cast.
Il y a des solutions plus propres pour faire ce que tu veux
faire une fonction virtuelle definie dans A
qui A::PrintOnStream(ostream os)
que tu redefinis pour chacune des sous-classes B et C.
ce qui n'impose pas de savoir combien de classes
derivant de A tu auras au final. (c'est l'interet d'avoir
des fonctions virtuelles par rapport au switch)
A+
Gregory
Marsh Posté le 21-01-2002 à 21:10:32
legreg a écrit a écrit : le dynamic_cast est plus safe. C'est a dire qu'avant de te rendre ton pointeur vers un objet de type B elle verifiera au préalable que 'a' est bien de type 'B' (grace aux informations de types). Sinon elle levera une exception. (Bad_cast). A+ LEGREG |
Une exception est levée pour des dynamic_cast ratés sur des références.
Par contre avec des pointeurs, NULL est retourné si le cast échoue.
[edtdd]--Message édité par Verdoux--[/edtdd]
Marsh Posté le 21-01-2002 à 15:28:32
saluti,
est-il possible de faire
A * machin;
B * brol;
brol = dynamic_cast <B *> (machin);
cout << brol->data();
mais en plus court ; sans passer par une variable intermediaire (brol) ?