Types de cast en C++

Types de cast en C++ - C++ - Programmation

Marsh Posté le 24-06-2006 à 18:58:44    

Quelqu'un peut-il se dévouer pour expliquer les différences entre :
static_cast
dynamic_cast
reinterpret_cast et
const_cast
 
?
 
 :hello:

Reply

Marsh Posté le 24-06-2006 à 18:58:44   

Reply

Marsh Posté le 24-06-2006 à 19:19:16    

Google Knows [:dawa]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-06-2006 à 20:28:58    

Use the force, read the doc, slash33

Reply

Marsh Posté le 24-06-2006 à 21:06:12    

Quelle doc ? Google knows what ?
Les réponses dans cette cat sont de plus en plus intéressantes à lire.
 
/33> consultes http://www.gotw.ca/gotw/017.htm  
C'est un sujet vaste, et pas inintéressant. J'avoue que je n'ai pas le courage ni le temps pour me lancer dans un exposé -- qui serait à coup sur inexact. Si tu as des questions plus précises, ça doit être jouable d'y répondre, ou au moins d'en discuter, autrement qu'à coup d'RTFM.
 
Tu peux aussi rajouter C-cast dans ta liste.

Message cité 2 fois
Message édité par ++fab le 24-06-2006 à 21:06:53
Reply

Marsh Posté le 24-06-2006 à 21:20:47    

http://www.google.fr/search?hs=wsX [...] DcountryFR
 
premier lien [:spamafote]
 
Et n'importe quel bouquin valable de c++ en cause ...


---------------
Töp of the plöp
Reply

Marsh Posté le 24-06-2006 à 21:22:32    

++fab a écrit :


Tu peux aussi rajouter C-cast dans ta liste.


 
oui, en tenant compte que c'est déprécié.

Reply

Marsh Posté le 24-06-2006 à 21:23:45    

++fab a écrit :

Quelle doc ? Google knows what ?


Il demande une explication des 4 casts C++ et des différences entre eux, il suffit de googler "C++ cast" pour avoir touzemille pages de résultat sur le sujet [:pingouino]

_darkalt3_ a écrit :

http://www.google.fr/search?hs=wsX [...] DcountryFR
 
premier lien [:spamafote]
 
Et n'importe quel bouquin valable de c++ en cause ...


http://www.google.fr/search?q=C%2B%2B+cast
 
toute la page, et les suivantes [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-06-2006 à 21:25:52    

Ben oui, c'est quand même un minimum quand on étudie le c++ ...
 
++fab: Je ne pense pas qu'on puisse apprendre un langage sans s'auto-documenter sur les mécanisme de base [:spamafote]


---------------
Töp of the plöp
Reply

Marsh Posté le 24-06-2006 à 21:52:57    

Bon je vais être plus explicite:
 
Sous VS 6.0, en MFC pourquoi
 

Code :
  1. CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());


 
produit des warnings à la compilation?

Code :
  1. warning C4541: 'dynamic_cast' used on polymorphic type 'class CWnd' with /GR-; unpredictable behavior may result

Reply

Marsh Posté le 24-06-2006 à 21:55:48    

sans doute parce que l'option /GR- desactive le support du rtti, il faut l'enlever, mais regarde quand meme la doc du compilateur pour etre sur

Reply

Marsh Posté le 24-06-2006 à 21:55:48   

Reply

Marsh Posté le 25-06-2006 à 00:02:42    

ok

Reply

Marsh Posté le 25-06-2006 à 12:12:08    

skelter a écrit :

oui, en tenant compte que c'est déprécié.


Je dirais plutôt déconseillé. Non déprécié au nom de la compatibilité C.
Mais dans la vraie vie, c'est le cast que je croise le plus souvent. Donc connaitre la différence entre chaque nouveau cast et le C-cast me parait important.

Reply

Marsh Posté le 25-06-2006 à 12:14:44    

masklinn a écrit :

Il demande une explication des 4 casts C++ et des différences entre eux, il suffit de googler "C++ cast" pour avoir touzemille pages de résultat sur le sujet [:pingouino]
 
http://www.google.fr/search?q=C%2B%2B+cast
 
toute la page, et les suivantes [:pingouino]


 
Ce qui demande d'être capable de faire le tri entre les bonnes pages et les mauvaises. Chose que tu n'es pas capable de faire lorsque tu es débutant, et pas seulement.

Reply

Marsh Posté le 25-06-2006 à 12:23:35    

_darkalt3_ a écrit :

Ben oui, c'est quand même un minimum quand on étudie le c++ ...


?
 

_darkalt3_ a écrit :

++fab: Je ne pense pas qu'on puisse apprendre un langage sans s'auto-documenter sur les mécanisme de base [:spamafote]


Je me demande juste si c'est la peine de moraliser toute personne qui veut avoir des informations sur les mécanismes de bases comme tu dis.

Reply

Marsh Posté le 25-06-2006 à 15:20:45    

Mécanismes de base, je ne sais pas. Par contre il est certain que les cast C++ ne sont pas utilisés en MFC qui pourtant est un hybride C/C++. Vu la quantité de code qui m'est passé sous la main depuis plusieurs années, est-ce si important que ça lorsqu'on combine les cast avec la programmation défensive (contrôle post transtypage) ?

Message cité 1 fois
Message édité par slash33 le 25-06-2006 à 15:23:31
Reply

Marsh Posté le 25-06-2006 à 15:28:52    

++fab a écrit :

Je dirais plutôt déconseillé.


 
oui, je croyais que ca l'était mais en fait non
 

++fab a écrit :

Non déprécié au nom de la compatibilité C.


 
il y a quand meme points qui permettent la compatibilité avec le C et qui sont dépréciés

Reply

Marsh Posté le 25-06-2006 à 15:32:24    

test profil


Message édité par Giz le 25-06-2006 à 15:32:51

---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 25-06-2006 à 15:51:51    

skelter a écrit :

il y a quand meme points qui permettent la compatibilité avec le C et qui sont dépréciés


comme ?

Reply

Marsh Posté le 25-06-2006 à 15:54:55    

slash33 a écrit :

est-ce si important que ça lorsqu'on combine les cast avec la programmation défensive (contrôle post transtypage) ?


Peux-tu en montrer un exemple ?

Reply

Marsh Posté le 25-06-2006 à 15:57:43    


 
ben static en porté global pour rendre local a la TU une fonction ou un objet, et 'char * p = "machin";'
 
annexe D, D.2 et D.4

Message cité 2 fois
Message édité par skelter le 25-06-2006 à 15:59:00
Reply

Marsh Posté le 25-06-2006 à 16:25:41    

skelter a écrit :

ben static en porté global pour rendre local a la TU une fonction ou un objet'


à une fonction ? Ce n'est pas ce que je lis ...
 

Citation :

et 'char * p = "machin";'


Yep

Reply

Marsh Posté le 25-06-2006 à 16:40:58    

oui ca ne concerne pas les fonctions

Reply

Marsh Posté le 25-06-2006 à 16:48:59    

++fab a écrit :

Peux-tu en montrer un exemple ?


Code :
  1. CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
  2. ASSERT_KINDOF(CMainFrame, pFrame);


 
D'accord le code défensif n'avertit du problème qu'en version debug.

Reply

Marsh Posté le 25-06-2006 à 16:51:10    

skelter a écrit :

annexe D, D.2 et D.4


Annexes de quelle référence SVP ? :)

Reply

Marsh Posté le 25-06-2006 à 17:04:19    

slash33 a écrit :

Annexes de quelle référence SVP ? :)


Le standard.

Reply

Marsh Posté le 25-06-2006 à 17:06:36    

slash33 a écrit :

Code :
  1. CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
  2. ASSERT_KINDOF(CMainFrame, pFrame);


 
D'accord le code défensif n'avertit du problème qu'en version debug.


Je ne connais pas la sémantique d'ASSERT_KINDOF, je ne peux donc pas commenter.

Reply

Marsh Posté le 25-06-2006 à 17:11:31    

Hum. J'ai bien cherché là mais je n'ai pas trouvé:
http://www.open-std.org/JTC1/SC22/WG21/

Reply

Marsh Posté le 25-06-2006 à 17:14:35    

++fab a écrit :

Je ne connais pas la sémantique d'ASSERT_KINDOF, je ne peux donc pas commenter.


Ben voici sa définition mais je ne suis pas sûr que ça t'aide  :o  

Code :
  1. #define ASSERT_KINDOF(class_name, object) \
  2. ASSERT((object)->IsKindOf(RUNTIME_CLASS(class_name)))

Reply

Marsh Posté le 25-06-2006 à 17:21:19    

en gros c'est equivalent a

Code :
  1. CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
  2. assert(pFrame);

Reply

Marsh Posté le 25-06-2006 à 17:34:43    

Quand le flag _DEBUG est positionné oui. Mais l'nstruction contrôle aussi le type de l'objet (et son héritage).
 
Un truc hérité de CObject en fait.


Message édité par slash33 le 25-06-2006 à 17:36:06
Reply

Marsh Posté le 25-06-2006 à 18:04:16    

Je vois 2 problèmes avec le C-cast dans l'exemple MFC :
- la cv-qualification est ignoré.
- en cas d'héritage virtuel, AMHA le C-cast posera problème. un code MFC est-il compilable avec un autre compilateur que VC++ ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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