Page de garde C++ Le RTTI et les opérateurs de cast Maîtrise dinformatique Février 2002.

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Programmation Orienté Objet en C++
Rappels C.
Formation universitaire à .NET: Introduction à C#
C++ 6ème cours Patrick Reuter maître de conférences
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Langages objet Définitions Traduction des méthodes en C++
C.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Leçon 3 : Héritage IUP 2 Génie Informatique
Chapitre III Héritage (début)
Page de garde Doc++ Maîtrise dinformatique Février 2002.
Maîtrise d’informatique
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
Bases de la programmation en C++ 1 Les enchaînementsdinstruction Séquentiels. Exécutions dinstructions les unes à la suite des autres. Instructions séparées.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Structures de données IFT Abder Alikacem Transtypage Module 1 Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Structures de données IFT Abder Alikacem Gestion des exceptions Département dinformatique et de génie logiciel Édition Septembre 2009.
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Langages orientés objets
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
Structures de données IFT-2000
Structures de données IFT-10541
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
Plan cours La notion de pointeur et d’adresse mémoire.
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Structures de données IFT-2000
La librairie assert.h.
2.1 - Historique Chapitre 2 : Introduction au langage C++
9ième Classe (Mardi, 4 novembre) CSI2572. H Nous avons vu comment utiliser les directives #define #ifndef #endif Pour s’assurer de l’inclusion unique.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Page de garde Design by Contract en C++ Maîtrise d’informatique Février 2002.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Notions avancées du C++
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
ETNA – 1ème année Guillaume Belmas –
Structures de données avancées : Arbres ‘Left Leaning Red-Black’
Les surcharges d'opérateurs
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
Le Préprocesseur. Sujets abordés: Préprocesseur –Qu’est ce? –Qu’est ce qu’une directive? Les macros –Les définir, les redéfinir, les dé-définir –Les macros.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Tutorat en bio-informatique Le 12 octobre Exercices 3 et 4 (MAT1400) - solutions La série du binôme (chap. 8.8) –Trouver la série entière et le.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
6ième Classe (Mercredi, 17 novembre) CSI2572
Langage de programmation
PRO-1027 Programmation Scientifique en C
Philippe Gandy - 15 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Flash – séance 2 Interactions avec Action Script.
C++ BY AURÉLIEN MODULO MARION. PLAN DES TROIS PRÉSENTATIONS C++ avancé C++ orienté objet Bases de C++
Transcription de la présentation:

Page de garde C++ Le RTTI et les opérateurs de cast Maîtrise dinformatique Février 2002

Le RTTI Le Run-Time Type Information (RTTI) Si la classe B étend la classe A, alors dans lexpression A * ptr= new B(); A* est le type statique de ptr, information que le compilateur conserve. B* est le type dynamique de ptr, information que le compilateur "oublie". Comment connaître le type dynamique de ptr à lexécution ?

Le RTTI Le Run-Time Type Information (RTTI) Solution à la main : class A {... virtual bool IsB() const { return false );... } class B: public A {... virtual bool IsB() const { return true );... } Implémentation fastidieuse et source potentielle derreurs. Implique de mettre à jour la classe racine lors de lajout de classes dérivées. Encombrement de la table des méthodes virtuelles. Exécution a priori très rapide.

Le RTTI Le Run-Time Type Information (RTTI) Solution C++ : le RTTI ! #include const type_info& typeid( expression_or_type ) /** égalité/inégalité stricte */ int type_info::operator==( const type_info& rhs ) const; int type_info::operator!=( const type_info& rhs ) const; /** nom human-readable */ const char * type_info::name() const; /** nom interne */ const char * type_info::raw_name() const; /** collating order (aucune indication hiérarchique !) */ int type_info::before( const type_info& rhs ) const;

Le RTTI Le Run-Time Type Information (RTTI) class A {... }; class B: public A {... }; const A * const a= new A(); const B * const b= new B(); typeid( a ).name() "class A const *" ????? const ????? typeid( *a ).name() "class A" ????? const ????? typeid( a ) == typeid( a ) true typeid( a ) == typeid( b ) false

Le RTTI Le Run-Time Type Information (RTTI) Attention : lutilisation de typeid sur des classes non polymorphes (i.e. sans fonctions virtuelles) pourrait renvoyer le type statique… Pour pouvoir utiliser typeid sur toutes les classes, il est nécessaire de forcer le compilateur à ajouter des informations de type dynamique aussi sur les classes classes non polymorphes : Visual C++ : /GR ou Project | Settings | C/C++ | C++ Language | Enable RTTI g++ : ?????????? Pensez à déréférencer les pointeurs pour obtenir des informations sur le type de lobjet pointé, et pas sur le type du pointeur ! Si ptr est 0/NULL, typeid( *ptr ) lance lexception std::bad_typeid.

Les opérateurs de cast 4 opérateurs de cast : reinterpret_cast aucune vérification static_cast vérification statique de plausibilité (downcast) dynamic_cast vérification dynamique (downcast) const_cast pour enlever const et/ou volatile Syntaxe générale : xxxxx_cast ( expression )

reinterpret_cast Correspond au cast de C (aucune vérification à la compilation, aucune vérification à lexécution) : reinterpret_cast ( choux ) Les casts "à la C" sont toujours accepté en C++ : (Carotte)choux Mais, les casts étant une source notable derreurs, il est bon de pouvoir les énumérer avec un simple grep !

static_cast Accepte uniquement de convertir un type en un type dérivé à la compilation ; aucune vérification à lexécution : static_cast ( choux ) Refuse notamment de convertir des pointeurs en entiers longs : static_cast ( apointer ) Utiliser reinterpret_cast, pas un cast "à la C" !

dynamic_cast Accepte uniquement de convertir un type en un type dérivé à la compilation avec vérification à lexécution, en utilisant le RTTI : dynamic_cast ( choux ) En cas derreur (le type dynamique de lexpression nest pas un type dérivé du type cible) : Les conversions de pointeurs retournent 0/NULL Les conversions de références lancent une exception std::bad_cast dynamic_cast est très similaire aux casts (de références) en Java

Upcasts et héritage multiple Lupcast en cas dhéritage multiple est ambigu : const D * const d= new D(); static|dynamic_cast ( d ) // ambigu ! Il faut dabord caster en B ou C, puis en A.

Downcasts et héritage virtuel Le downcast en cas dhéritage virtuel est ambigu : const A * const a= new E(); static|dynamic_cast ( a ) // ambigu ! Il faut dabord caster en E, puis en C ou D, puis en B.

const_cast Supprime, à la compilation, le caractère const ou volatile des expressions : (const_cast ( areference )).NonConstMethod(); Tout aussi alarmant concernant le design que dutiliser mutable …

Des casts contrôlés en mode debug Les casts sont malheureusement souvent nécessaires alors quils sont sources derreurs ! static_cast est dangereux, mais dynamic_cast est plus lent… Idée : utiliser une macro qui utilise dynamic_cast en mode debug et static_cast en mode release : #ifndef CHECKCASTS_ENABLED # define CASTREFERENCE( TargetType, SourceType, expr ) \ (static_cast ( expr )) #else # define CASTREFERENCE( TargetType, SourceType, expr ) \ (DynamicCastReference ( expr, \ __FILE__, \ __LINE__, \ #expr )) #endif

Des casts contrôlés en mode debug template TargetType& DynamicCastReference( SourceType& expr, const char * const strFilename, const int iLineNumber, const char * const strExpr ) { if (&expr == NULL) return (TargetType &)expr; else { TargetType * const result= dynamic_cast ( &expr ); if (result == NULL) ReferenceCastFailed( strExpr, strFilename, iLineNumber, typeid( expr ).name(), typeid( TargetType ).name() ); return *result; }

Des casts contrôlés en mode debug Inconvénient : il faut écrire le type source de lexpression. Mais, en cas derreur, lexécution du programme se termine immédiatement (on nattend pas que lerreur se propage), avec un yoli message derreur indiquant : le fichier et la ligne contenant lerreur ; lexpression fautive ; son type dynamique ; le type en lequel on a tenté de la convertir. Et tout cela aisément débranchable en mode release. Cela ne vaut-il pas la peine de taper quelques caractères supplémentaires ?

Lopérateur instanceof en C++ Rappel : type_info::before napporte aucune indication hiérarchique ! tenter de caster avec dynamic_cast, en utilisant des pointeurs (donc en prenant ladresse des références le cas échéant) et en testant que le résultat de dynamic_cast nest pas 0/NULL, sauf si le pointeur létait auparavant… a instanceof A ((a == 0) || (dynamic_cast ( a ) != 0))

Utilisez au maximum le typage statique ! Une des forces de C++ pour la correction des programmes est son très fort typage statique. Ne vous adonnez pas aux " switch es de type" : utilisez plutôt le polymorphisme !