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

  FORUM HardWare.fr
  Programmation
  C++

  cours cast

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

cours cast

n°500471
blackgodde​ss
vive le troll !
Posté le 28-08-2003 à 13:28:34  profilanswer
 

bonjour,  
 
je n'ai pas tres bien saisie dans quels cas utiliser un cast plutot qu'un autre comme static_cast<type>var plutot que reinterpret_cast<type>var.
 
pour l'instant j'utilise (type)var.
 
qq1 pourrait m'expliquer ou me donner un lien ?


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 28-08-2003 à 13:28:34  profilanswer
 

n°500477
Taz
bisounours-codeur
Posté le 28-08-2003 à 13:38:10  profilanswer
 

j'en ai pas. en tout cas, ne jamais utiliser (type), mais plutot type() (constructeur)
 
ensuite le static_cast (mot clef) c'est pour les cast bien définis et sur (comme par exemple, Derivée * vers Base *)
 
le reinterpret_cast, c'est le plus bourrin, l'équivalent du (type) en C, qui revient à dire au compilateur "ferme ta gueule", on verra plus tard si ça plante, ça sera tant pis pour moi

n°500486
Ashe2
Posté le 28-08-2003 à 13:52:25  profilanswer
 

En général :
 
- static_cast<>
Plutot pour float => int, int => char, ou autres scalaires. Ca marche aussi pour les pointeurs mais perso je prefere reinterpret_cast (qui est un peu moins safe).
 
- reinterpret_cast<>
Pour scalaire => pointeur et pointeur => scalaire, ou entre pointeurs (ca balance plein de warnings en compilant avec les warnings 64-bit par contre).
 
- const_cast<>
Rarement utile, a part pour certains messages Win32 ou il faut donner un LPTSTR dans une structure à partir d'un basic_string, et qu'on sait que ça ne sera pas modifié.
 
- dynamic_cast<>
Faut avoir rtti activé pour que ca fonctionne, et en général si on en a besoin c'est que le design du programme est pas terrible.
 
- cast C
Inutile en C++.
 
- type( ... )
C'est pas un cast, c'est un constructeur.

n°500487
Taz
bisounours-codeur
Posté le 28-08-2003 à 13:54:25  profilanswer
 

Citation :

- dynamic_cast<>
Faut avoir rtti activé pour que ca fonctionne, et en général si on en a besoin c'est que le design du programme est pas terrible.

:non: je dirai tout le contraire. ça existe des compilos ou il faut bidouiller pour avoir de RTTI? ça t'arrive jamais de devoir convertir un Base* en Truc*

n°500495
blackgodde​ss
vive le troll !
Posté le 28-08-2003 à 14:02:02  profilanswer
 

d'accord, j'ai pas tout compris mais j'y réfléchis :)
 
c quoi rtti ?


---------------
-( BlackGoddess )-
n°500503
Taz
bisounours-codeur
Posté le 28-08-2003 à 14:10:21  profilanswer
 

BlackGoddess a écrit :

d'accord, j'ai pas tout compris mais j'y réfléchis :)
 
c quoi rtti ?

Run Time Type Informations
 
fais un #include <tupeinfo>
 
et amuse toi avec
 
cout << typeid(variable).name() << endl;
 
ou  
 
typeid(machin)==typeid(truc)
 
pour commencer

n°500504
LetoII
Le dormeur doit se réveiller
Posté le 28-08-2003 à 14:11:38  profilanswer
 

BlackGoddess a écrit :

d'accord, j'ai pas tout compris mais j'y réfléchis :)
 
c quoi rtti ?


 
Run Time Type Informations me semble
 
[:benou_grilled]


Message édité par LetoII le 28-08-2003 à 14:11:57

---------------
Le Tyran
n°500579
Ashe2
Posté le 28-08-2003 à 15:04:29  profilanswer
 

Taz a écrit :

Citation :

- dynamic_cast<>
Faut avoir rtti activé pour que ca fonctionne, et en général si on en a besoin c'est que le design du programme est pas terrible.

:non: je dirai tout le contraire. ça existe des compilos ou il faut bidouiller pour avoir de RTTI? ça t'arrive jamais de devoir convertir un Base* en Truc*


 
Non ca m'arrive jamais de devoir convertir une Base * en un Truc *. Et si même ca arrivait (ce qui n'est jamais arrivé en 7 ans), ce serait fait autrement qu'avec RTTI, vu que c'est un peu énorme pour une seule utilisation. Et dans Visual C++ il faut l'activer (le RTTI).

n°500624
Taz
bisounours-codeur
Posté le 28-08-2003 à 15:33:31  profilanswer
 

c'est par ce que t'as un compilo de ***** que

n°500636
gatorette
Posté le 28-08-2003 à 15:40:55  profilanswer
 

Ashe2 a écrit :

- cast C
Inutile en C++.


 
J'étais prêt à répondre que ce n'était pas vrai en me basant sur cet article, mais je me suis dis que j'allais tester auparavant.
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. void func() { cout << "Base::func()" << endl; }
  6. };
  7. class Derived : private Base
  8. {
  9. };
  10. int main( int argc, char *argv[] )
  11. {
  12. Derived d;
  13. Base &b_static = static_cast<Base&>(d);
  14. b_static.func();
  15. Base &b_reinterpret = reinterpret_cast<Base&>(d);
  16. b_reinterpret.func();
  17. Base &b_oldc = (Base& )d;
  18. b_oldc.func();
  19. return 0;
  20. }


 
Et surprise, Visual Studio 6.0 SP5 et gcc 2.95.3 ne donnent pas le même résultat et aucun ne semble se comporter comme précisé dans l'article ci-dessus.
 
Visual Studio 6.0 SP5 :

  • static_cast : error C2243: 'static_cast' : conversion from 'class Derived *' to 'class Base &' exists, but is inaccessible
  • reinterpret_cast : pas d'erreur ni warning
  • C cast : warning C4243: type cast conversion from 'class Derived *' to 'class Base &' exists, but is inaccessible


gcc 2.95.3 :

  • static_cast : pas d'erreur ni warning
  • reinterpret_cast : pas d'erreur ni warning
  • C cast : pas d'erreur ni warning


Quel comportement est le bon ?  
 
Selon moi, le static_cast devrait générer une erreur. En effet, la conversion de Derived en Base n'est pas "normale" (car Base est caché par l'héritage privé). Le reinterpret_cast peut aussi fonctionner (je trouverais cela assez logique) mais selon l'article ci-dessus, il ne devrait pas. Le cast C doit fonctionner sans même un warning (je fais tout ce que je veux).
 
Il faudrait tester avec d'autres compilateurs également.
 
-- Edit --
quelques modifications pour rendre le tout plus clair


Message édité par gatorette le 28-08-2003 à 15:43:27

---------------
each day I don't die is cheating
mood
Publicité
Posté le 28-08-2003 à 15:40:55  profilanswer
 

n°500671
Taz
bisounours-codeur
Posté le 28-08-2003 à 15:59:47  profilanswer
 

gcc2.95 est vieux :o

n°500678
Taz
bisounours-codeur
Posté le 28-08-2003 à 16:07:29  profilanswer
 

et moi je compile en  
 
"-Werror -Wold-style-cast"  :o

n°500679
gatorette
Posté le 28-08-2003 à 16:07:50  profilanswer
 

Taz a écrit :

gcc2.95 est vieux :o  


Tout comme Visual Studio 6.0 SP5.
Désolé, mais j'ai utilisé les compilateurs que j'avais sous la main. A voir donc avec des compilateurs plus récents.
 

Taz a écrit :

et moi je compile en  
"-Werror -Wold-style-cast"  :o


Je n'utilise jamais gcc. J'ai regardé un tutorial rapidement et j'ai compilé avec "-g -Wall test.cpp -o test". Cependant en recompilant avec tes options cela ne change pas grand chose. Il indique juste que j'utilise un cast "old-style", ce qui n'est pas ce que je cherche à savoir.
 
Mais bon, ce qui m'intéresse surtout c'est de savoir quel est le comportement standard. Car entre l'article et les deux compilateurs que j'ai pu essayé, personne ne me donne la même réponse.


Message édité par gatorette le 28-08-2003 à 16:15:21

---------------
each day I don't die is cheating
n°709465
myst78
Posté le 27-04-2004 à 11:05:12  profilanswer
 

up (bon gros deterage la meme) :bounce:  
 
je me renseigne sur les cast en C++, et je suis tombe sur ce topic
mais j'ai pas trop saisit le const_cast et encore moins le dynamic_cast
qqn aurait des exemples plus precis ?
 
a+


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709513
SoWhatIn22
Posté le 27-04-2004 à 11:35:08  profilanswer
 

Ashe2 a écrit :


- dynamic_cast<>
Faut avoir rtti activé pour que ca fonctionne, et en général si on en a besoin c'est que le design du programme est pas terrible.


 
et tu crois vraiment que les gars qui ont pensé à cet opérateur de cast se sont dits "tient, on va mettre aussi celui-là pour ceux qui concoivent comme des gorets" ?
 
tu ne connais peux être pas de cas où une telle utilisation est nécessaire, mais il y en a.

n°709526
blackgodde​ss
vive le troll !
Posté le 27-04-2004 à 11:41:49  profilanswer
 

myst78 >> j'ai essayé de faire un tutorial sur le static_cast / dynamic_cast :
http://forums.dev-communaute.com/i [...] f=11&t=214


---------------
-( BlackGoddess )-
n°709616
myst78
Posté le 27-04-2004 à 13:03:17  profilanswer
 

blackgoddess a écrit :

myst78 >> j'ai essayé de faire un tutorial sur le static_cast / dynamic_cast :
http://forums.dev-communaute.com/i [...] f=11&t=214


hum, si j'ai bien compris ton tut, le dynamic c'est pour descendre dans la hierarchie et le static pour remonter ?
mais ca marche pas dans l'autre sens ?
genre dans ton tut si ej fais

Code :
  1. Chien *chien = static_cast<Chien*>(ListeAnimaux[i]);

ca passe ou pas ? si oui, quel est la difference, et pourquoi choisir le dynamic plutot que le static ?


Message édité par myst78 le 27-04-2004 à 13:03:44

---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709620
SoWhatIn22
Posté le 27-04-2004 à 13:05:57  profilanswer
 

ça passe à la compilation, mais tu ne connaitras le résultat du cast qu'à l'execution. Si celui-ci échoue, alors ton pointeur vaut 0, sinon il vaut ListeAnimaux[i] (mais avec le type Chien *).


Message édité par SoWhatIn22 le 27-04-2004 à 13:06:11
n°709626
myst78
Posté le 27-04-2004 à 13:09:37  profilanswer
 

ben euh oui d'accord, alors pardon d'insister et de jouer les neuneus la mais je pige toujours pas la difference :/
tu parles duquel la en plus ?


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709627
Taz
bisounours-codeur
Posté le 27-04-2004 à 13:09:42  profilanswer
 

c'est quoi comme type ListAnimaux[i] ? si c'est pas apparenté à un chien, ça ne passera pas à la compilation : il faut alors utilisé le dynamic_cast qui peut échouer. sinon, si c'est un sous-type de chien, pas besoin de cast

n°709631
myst78
Posté le 27-04-2004 à 13:10:51  profilanswer
 

Taz a écrit :

c'est quoi comme type ListAnimaux[i] ? si c'est pas apparenté à un chien, ça ne passera pas à la compilation : il faut alors utilisé le dynamic_cast qui peut échouer. sinon, si c'est un sous-type de chien, pas besoin de cast


Code :
  1. vector<Animal*> ListeAnimaux;


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709632
Taz
bisounours-codeur
Posté le 27-04-2004 à 13:12:01  profilanswer
 

bah si Chien est un Animal, il faut utiliser le dynamic_cast

n°709633
SoWhatIn22
Posté le 27-04-2004 à 13:13:29  profilanswer
 

note:
  dans static_cast, il y a static
  dans dynamic_cast, il y a dynamic
 
autrement dit:
   il y en a un dont tu connais le résultat à la compilation
   tu ne peux connaitre le résultat de l'autre 'à l'execution

n°709635
myst78
Posté le 27-04-2004 à 13:14:49  profilanswer
 

*insiste encore :p*
d'accord mais pourquoi dynamic plutot que static alors ? Dans quel cas on choisit l'un plutot que l'autre


Message édité par myst78 le 27-04-2004 à 13:15:57

---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709637
Taz
bisounours-codeur
Posté le 27-04-2004 à 13:15:28  profilanswer
 

tu peux dire avec certitude si ton Animal* pointe en fait vers un Chien ?

n°709638
myst78
Posté le 27-04-2004 à 13:16:23  profilanswer
 

Taz a écrit :

tu peux dire avec certitude si ton Animal* pointe en fait vers un Chien ?


non :p


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709641
myst78
Posté le 27-04-2004 à 13:17:42  profilanswer
 

ok je crois que j'ai compris  :D
merci de votre patience ;)


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709725
blackgodde​ss
vive le troll !
Posté le 27-04-2004 à 14:42:26  profilanswer
 

Chien et Chat héritent d'Animal. Ceci est défini pour la compilation, le compilo le sait donc. Le static_cast, qui permet d'aller d'un  type Chat ou Chien vers un type Animal, (en effet, si un objet Chien ou Chat hérite des méthodes d'un objet Animal) et donc validé à la compilation. Par contre, l'inverse n'est pas forcément vrai : un objet de type Animal pourra en réalité être une instance de Chien, de Chat ou d'animal. Le test ne peut pas être effectué par le compilateur, et c'est donc à l'exécution qu'il est validé, d'où le nom : dynamic_cast.


---------------
-( BlackGoddess )-
n°709726
Taz
bisounours-codeur
Posté le 27-04-2004 à 14:43:51  profilanswer
 

"qui permet d'aller d'un  type Chat ou Chien vers un type Animal" pas besoin de static_cast, Chat est un Animal.

n°709734
blackgodde​ss
vive le troll !
Posté le 27-04-2004 à 14:50:56  profilanswer
 

oui, on peut écrire directement
Animal *a = new Chien();
a la place de  
Animal *a = static_cast<Animal*>(new Chien());
mais j'ai préféré la 2eme pour bien mettre en evidence le transtypage qui doit être implict dans le 2eme non ?
 
quand un static_cast est-il vraiment nécéssaire ?
 
sinon, j'ai entendu dire que les opérateurs de transtypage C++ pouvaient être appelés avec des références au lieu des pointeurs, dans quelles conditions c'est possible ?


---------------
-( BlackGoddess )-
n°709742
Taz
bisounours-codeur
Posté le 27-04-2004 à 14:55:35  profilanswer
 

mais y a pas de transtypage : un Chien est un animal
 
 
tu t'amuse pas à écrire
 
int i= static_cast<int>(42) quand même ?
 
le static_cast est nécessaire quand tu dois faire une __conversion__ bien défini à la compilation. encore faut il que tu es une conversion à faire

n°709743
myst78
Posté le 27-04-2004 à 14:55:38  profilanswer
 

merci pour les precisions, j'avais bien fini par comprendre ca :p
sinon je me pose aussi tes 2 questions (surtout la premiere du coup)...


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°709758
blackgodde​ss
vive le troll !
Posté le 27-04-2004 à 15:15:05  profilanswer
 

Taz > pourrait-on avoir un petit exemple ou la conversion est nécéssaire stp ?


---------------
-( BlackGoddess )-
n°709769
HelloWorld
Salut tout le monde!
Posté le 27-04-2004 à 15:22:42  profilanswer
 

le static_cast j'ai du mal à l'utiliser pour caster le signe (convertir un size_t en int ou vice versa).
Je l'emploie plutot pour les type (int <-> float) ou la taille (short <-> int).
 

n°709778
Taz
bisounours-codeur
Posté le 27-04-2004 à 15:29:59  profilanswer
 

ben l'exemple devenu célèbre
 

Code :
  1. #include <algorithm>
  2. #include <cctype>
  3. #include <iostream>
  4. #include <iterator>
  5.                                                                                                                            
  6. int main()
  7. {
  8.   const char *s = "tokra";
  9.                                                                                                                            
  10.   std::transform(&s[0], &s[0] + 5,
  11.                  std::ostream_iterator<char>(std::cout),
  12.                  static_cast<int (& )(int)>(std::toupper));
  13.                                                                                                                            
  14.   std::cout << std::endl;
  15. }


 
// & ou *
 
 
en fait le static_cast ne sert pas tant à convertir, puisque le C++ est laxiste, beaucoup de choses passent implicitement, mais souvent à expliciter le type

n°709780
HelloWorld
Salut tout le monde!
Posté le 27-04-2004 à 15:32:03  profilanswer
 

Citation :

const char *s = "tokra";


Alors, toujours pas trouvé d'utilité aux char * ? ;)

n°724584
Taz
bisounours-codeur
Posté le 13-05-2004 à 12:55:40  profilanswer
 

Code :
  1. struct Foo
  2. {
  3.   Foo & operator=(const Foo &other)
  4.   {
  5.     // ...
  6.     return *this;
  7.   }
  8. };
  9. struct Bar : Foo
  10. {
  11.   Bar & operator=(const Bar &other)
  12.   {
  13.     // ...
  14.     return static_cast<Bar&>( Foo::operator=(other) );
  15.   }
  16. };
  17. int main()
  18. {
  19.   Bar a, b;
  20.   a = b;
  21. }

mood
Publicité
Posté le   profilanswer
 


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

  cours cast

 

Sujets relatifs
ca cast les ....[C++] Concours de code : new test en cours, proposez votre solution !
[Access][VBA]Recup la clef autoincrémenté de l'enregistrement en coursActiver un bouton sur une autre fenetre que celle en cours
Cherche cours d'optimisation de code PHP !cherche url d'un site de cours php/mysql...
changer de couleur en cours d'ecriture dans une richtextbox? [C#]Récuperer le domaine en cours ( - Job's Done - )
Client/Serveur + scannage d'une session en cours[PHP] session_id retourne l'ID de la session en cours !!! explication
Plus de sujets relatifs à : cours cast


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