Home

C++ : PROGRAMMATION

image

Contents

1. un point repr sentant le centre un nombre repr sentant le rayon un nombre repr sentant la surface du cercle Permettre l acc s direct la variable surface c est s exposer ce qu elle soit modifi e depuis l ext rieur et cela serait catastrophique puisque l objet risquerait alors de perdre sa coh rence la surface d pend en fait du rayon Il est donc indispensable d interdire cet acc s ou au moins permettre l objet de le contr ler 1 3 2 Donn es et fonctions membres d un objet O seront d clar es publiques si on autorise leur utilisa tion en dehors de l objet O priv es si seul l objet O peut y faire r f rence Dans la d claration d une classe comment d cider de ce qui sera public ou priv Une approche simple et s re consiste d clarer syst matiquement les donn es membres priv es et les fonctions membres publiques On peut alors autoriser l acc s aux donn es membres pour consultation ou modification par des fonctions pr vues cet effet appel es fonctions d acc s Ainsi la d claration de la classe Cercle ci dessus pourrait ressembler 3 classe Cercle priv public centre Fixer_centre rayon Fixer rayon surface Donner _surface Tracer Dans le cas d une classe chronometre 1 1 4 il suffirait de ne d clarer publiques que les seules fonctions membres Afficher et Presser_sur un_bouton pour que les chronom tres puissent
2. 20 class Derivee public Base h ritage public ou class Derivee private Base h ritage priv Il faut savoir que dans le premier cas les membres h rit s conservent les m mes droits d acc s public ou pro tected que dans la classe de base dans le second cas cas par d faut si rien n est pr cis tous les membres h rit s deviennent priv s dans la classe d riv e On conseille g n ralement d utiliser l h ritage public car dans le cas contraire on se prive de pouvoir cr er de nouvelles classes elles m mes d riv es de la classe d riv e 3 2 5 Constructeurs et destructeurs Quand un objet est cr si cet objet appartient une classe d riv e le constructeur de la classe parente est d abord appel Quand un objet est d truit si cet objet appartient une classe d riv e le destructeur de la classe parente est appel apr s Ces m canismes se g n ralisent une cha ne d h ritages Voici un exemple include lt iostream h gt class GrandPere Men donn es membres public GrandPere void GrandPere class Pere public GrandPere sise donn es membres public Pere void Pere class Fils public Pere des donn es membres public Fils void Fils void main Fils xjunior junior new Fils appels successifs des constructeurs de GrandPere Pere et Fils delete junior appels successifs des de
3. utilisation 1 4 3 Rappelons que la directive d inclusion include permet d inclure un fichier de d clarations dans un autre fichier on crira include lt untel h gt s il s agit d un fichier standard livr avec le compilateur C ou include untel h s il s agit d un fichier crit par nous m mes 1 5 Mise en uvre 1 5 1 Nous donnons ici un programme complet afin d illustrer les principes expos s au paragraphe pr c dent Ce programme simule le fonctionnement d un parem tre Le programme se compose de trois fichiers parcmetr h qui contient la d claration de la classe Parcmetre parcmetr cpp qui contient la d finition de la classe Parcmetre simul cpp qui contient l utilisation de la classe Parcmetre 1 Matos case secours aie parcmetr h ce fichier contient la d claration de la classe Parcmetre class Parcmetre public Parcmetre constructeur de la classe void Affiche affichage du temps de stationnement void PrendsPiece float valeur introduction d une pi ce private int heures chiffre des heures minutes et des minutes F dl T E parcmetr Cpp ce fichier contient la d finition de la classe Parcmetre include lt iostream h gt pour les entr es sorties include parcmetr h d claration de la classe Parcmetre Parcmetre Parcmetre initialisation d un nouveau parcm tre heures min
4. PRESSE RARE RARES SOEUR PRE esse ce fichier contient la d claration de la classe Joueur class Joueur public Joueur initialise un joueur int Propose int diag re oit le diagnostic du pr c dent essai renvoie une nouvelle proposition private int min max fourchette pour la recherche proposition dernier nombre propos 2 5 7 6 tape criture du traitement principal Ce fichier contient l utilisation des classes Jiran n enan jeu cpp sAr programme de simulation du jeu c est plus c est moins include lt iostream h gt pour les entr es sorties include joueur h pour la d claration de la classe Joueur include meneur h pour la d claration de la classe Meneur void main g re une partie Joueur j avec un joueur Meneur m et un meneur int p d 1 variables auxiliaires cpt 0 nombre d essais do simulation du d roulement du jeu p j Propose d proposition du joueur d m Reponds p diagnostic du meneur cpt while d amp amp cpt lt 6 if d faite du joueur cout lt lt nLe joueur a perdu else victoire du joueur cout lt lt nLe joueur a gagn Nous pourrions d s pr sent compiler ce fichier jeu cpp alors que les classes Joueur et Meneur ne sont pas encore d finies 2 5 8 7 tape d finition des classes C est l ultime tape pour laquelle nou
5. extraire un l ment On parle de pile lorsque l l ment extrait est le dernier en date avoir t mis structure LIFO pour Last In First Out et de queue ou file d attente lorsque l l ment extrait est le premier en date avoir t mis structure FIFO pour First In First Out Voulant programmer une classe Pile et une classe Queue nous commencerons par crire une classe abstraite Boite d crivant la partie commune ces deux classes class Boite classe abstraite d crivant une structure de stockage les l ments stock s sont de type pointeur sur Objet la classe Objet est suppos e d j d clar e public Boite int n 10 construit une bo te contenant au maximum n pointeurs Boite destructeur virtual void Mets Objet po 0 met dans la bo te le pointeur po virtual Objet Extrais 0 extrait un pointeur de la bo te int Vide indique si la bo te est vide int Pleine indique si la bo te est pleine protected int vide pleine indicateurs int taille capacit de la bo te Objet T consid r comme tableau de pointeurs sur Objet 3 fee eee d finition de la classe Boite Boite Boite int n taille n T new Objet taille on peut pr voir ici un test de d bordement m moire vide 1 pleine 0 LE Boite Boite delete T lib re l espace point par T 30 int Boite Vide ret
6. la valeur de diag est ignor e nProposition cin gt gt p return p Seconde version meneur cpp ce fichier contient la d finition de la classe Meneur le r le du meneur est tenu par l utilisateur du programme include lt iostream h gt include meneur h Meneur Meneur cout lt lt cout lt lt int Meneur int r cout lt lt cout lt lt cout lt lt cout lt lt Reponds int prop nBonjour Vous allez jouer le r le du meneur nChoisissez un num ro secret entre 1 et 100 la valeur de prop est ignor e n0 C est exact ni C est plus n2 C est moins nVotre r ponse 0 1 2 16 cin gt gt r return r TASER SE EE SEE joueur cpp ce fichier contient la d finition de la classe Joueur le r le du joueur est tenu par l ordinateur include lt iostream h gt include joueur h Joueur Joueur min 1 fixe la fourchette dans laquelle max 100 se trouve le num ro deviner proposition 0 premi re proposition fictive int Joueur Propose int diag if diag 1 ajuste la fourchette min proposition 1 else max proposition 1 proposition min max 2 proc de par dichotomie cout lt lt nJe propose lt lt proposition return proposition Remarque Quand nous aurons abord les notions d h ritage et de pol
7. MFC Ces classes d crivent notamment des objets de type fen tre CWnd document CDoc vue CView et application CWinApp 5 1 2 AppWizard Sous Visual C la plus grosse partie du code peut tre crite automatiquement par l assistant d application AppWizard il suffit pour cela de cr er un projet de type MFC AppWizard exe Si l application est de type SDI Single Document Interface trois classes importantes sont alors pr programm es qui d crivent La fen tre principale de l application classe d riv e de CWnd Un document classe d riv e de CDoc vide au d part Une vue classe d riv e de CView charg e de repr senter le document l cran A partir de ces classes le travail consiste g n ralement ajouter des donn es et fonctions membres afin de personnaliser l application Pour cela on a le choix entre modifier directement les fichiers sources h et cpp ou alors utiliser le menu contextuel clic droit de la souris sur le nom d une classe figurant dans le browser onglet ClassView 5 1 3 Contexte graphique Tout trac doit imp rativement tre effectu par la fonction membre OnDraw de la classe CView Cela permet l application de refaire automatiquement le trac d s que le besoin s en fait sentir par exemple lorsque la fen tre passe au premier plan apr s avoir t partiellement cach e par une autre fen tre Le rep rage d un pixel sur l cran se f
8. cout setf ios right cout lt lt Bonjour affiche xxx Bonjour Autre exemple cout width 8 cout precision 5 cout lt lt 100 0 3 0 affiche 33 333 avec deux blancs devant 4 5 3 Manipulateurs Ils permettent de modifier l apparence des sorties et sont contenus dans la librairie lt iomanip h gt endl marque une fin de ligne et r initialise le flot setfill c correspond fi11 setprecision p correspond precision setw n correspond width setbase b fixe la base de num ration Sauf pour setprecision ces manipulateurs n agissent que sur la prochaine sortie Exemple cout lt lt setbase 16 lt lt 256 lt lt endl affiche 100 et passe la ligne cout lt lt setprecision 5 lt lt 123 45678 affiche 123 46 38 APPENDICE A 1 Relation d amiti A 1 1 On sait que lorsque des donn es et fonctions membres d une classe sont priv es ou prot g es elles sont inaccessibles depuis l ext rieur de la classe c est le principe de l encapsulation Si on a besoin d y acc der on peut crire des fonctions r serv es cet effet fonctions d acc s et pr voir ainsi des contr les et actions suppl mentaires Une autre possibilit propre au C est d utiliser une d claration d amiti avec le mot friend A 1 2 Fonctions amies Une fonction amie d une classe est une fonction qui sans tre membre de la classe a n anmoins acc s toutes les donn
9. es et fonctions membres de cette classe qu elles soient publiques prot g es ou priv es Une telle fonction amie doit tre d clar e l int rieur de la d claration de la classe S il s agit d une fonction libre i e ext rieure toute classe class friend truc machin fonction libre amie de la classe A public private F S il s agit d une fonction membre d une autre classe class B informe le compilateur qu il existe une classe nomm e B class A friend truc B machin fonction membre de la classe B amie de la classe A public private A 1 3 Il peut tre pratique d utiliser une d claration d amiti pour surcharger certains op rateurs Voici un exemple avec l op rateur de sortie lt lt voir 4 4 class A friend ostream amp operator lt lt ostream amp os A amp mon0bj d claration private int T 10 ostream amp operator lt lt ostream amp os A amp mon0bj d finition de la surcharge for int i 0 i lt 10 i os lt lt mon0bj T i donn e accessible gr ce l amiti return os 39 A 1 4 Classes amies Lorsque toutes les fonctions membres d une classe B sont amies d une classe A on dit que la classe B est amie de A Au lieu de d clarer dans la classe A chaque fonction membre de B comme amie on crit plus simplement class B informe le compilateur qu il existe une classe nomm e B clas
10. lt lt ni C est plus cout lt lt n2 C est moins cout lt lt nVotre choix 0 1 ou 2 cin gt gt ri return r include meneuror h include lt iostream h gt include lt string h gt include lt stdlib h gt include lt time h gt MeneurDrdinateur MeneurOrdinateur strcpy nom l ordinateur srand unsigned time NULL numsecret 1 rand 100 int MeneurOrdinateur Reponds int prop cout lt lt R ponse de AfficheNom if prop lt numsecret cout lt lt c est plus n return 1 else if prop gt numsecret cout lt lt c est moins n return 2 27 cout lt lt c est exact n return 0 include joueurhu h include lt iostream h gt JoueurHumain JoueurHumain cout lt lt Vous faites le joueur Quel est votre nom cin gt gt nom int JoueurHumain Propose int diag AfficheNom int p cout lt lt votre proposition cin gt gt p return p le joueuror cpp include meneuror h include lt iostream h gt include lt string h gt Joueur0rdinateur JoueurOrdinateur strcpy nom l ordinateur min 1 max 100 proposition 0 int Joueur0Ordinateur Propose int diag if diag 1 min proposition 1 else max proposition 1 proposition min max 2 AfficheNom cout lt lt propose
11. parties r elle et imaginaire I RRR RS ESS SSSR EEE complexe pp Essespessese een d finition de la classe Complexe include lt iostream h gt pour les entr es sorties include complexe h d claration de la classe Complexe Complexe Complexe float x float y re x im y Complexe Complexe re 0 0 im 0 0 void Complexe Lis cout lt lt Partie r elle cin gt gt re cout lt lt Partie imaginaire cin gt gt im void Complexe Affiche cout lt lt re lt lt i lt lt im Complexe Complexe operator Complexe g constructeur avec param tres constructeur sans param tre lecture d un complexe affichage d un complexe surcharge de l op rateur return Complexe re g re im g im appel du constructeur can Deere res USASEL DR Een nee exemple d utilisation de la classe Complexe include lt iostream h gt pour les entr es sorties include complexe h pour la d claration de la classe Complexe void main traitement principal Complexe z1 0 0 1 0 appel implicite du constructeur param tr Complexe z2 appel implicite du constructeur non param tr zi Affiche affichage de z1 cout lt lt nEntrer un nombre complexe z2 Lis saisie de z2 cout lt lt nVous avez entr z2 Affiche affichage de z2 Complexe z3 z1 z2 somme de
12. 42 5 1 Outils A S a a a A2 5 2 Premier exemple 43 5 3 Am lioration de l interface 43 ii Chapitre 1 LE CONCEPT D OBJET Apparue au d but des ann es 70 la programmation orient e objet r pond aux n cessit s de l informatique professionnelle Elle offre aux concepteurs de logiciels une grande souplesse de travail permet une main tenance et une volution plus ais e des produits Mais sa pratique passe par une approche radicalement diff rente des m thodes de programmation tradi tionnelles avec les langages objets le programmeur devient metteur en sc ne d un jeu collectif o chaque objet acteur se voit attribuer un r le bien pr cis Ce cours a pour but d expliquer les r gles de ce jeu La syntaxe de base du langage C expos e dans un pr c dent cours est suppos e connue 1 1 Objet usuel 1 1 1 Comment d crire un objet usuel Prenons exemple sur la notice d utilisation d un appareil m nager Cette notice a g n ralement trois parties a une description physique de l appareil et de ses principaux l ments boutons voyants lumineux cadrans etc sch mas l appui b une description des fonctions de chaque l ment c un mode d emploi d crivant la succession des man uvres faire pour utiliser l appareil Seules les parties a et b sont intrins ques l appareil la partie c concerne l utilisateur et rien n emp che celui ci de se
13. Complexe re u re im u im 2 4 4 Autre cas d un op rateur binaire Cette fois nous d sirons d finir un op rateur qui appliqu deux objets d une m me classe donne une valeur d un type diff rent Ce cas est plus compliqu que le pr c dent On consid re la classe culinaire suivante class Plat d crit un plat propos au menu d un restaurant public float Getprix fonction d acc s donnant le prix voir 1 3 2 private char nom 20 nom du plat float prix et son prix Nous voulons surcharger l op rateur pour qu en crivant par exemple poulet fromage cela donne le prix total des deux plats poulet et fromage suppos s de type Plat Nous commen ons par d clarer la fonction membre float operator Plat p que nous d finissons par float Plat operator Plat p et que nous pouvons ensuite utiliser en crivant par exemple poulet fromage Nous d finissons ainsi une loi d addition Plat x Plat float return prix p Getprix Mais que se passe t il si nous voulons calculer salade poulet fromage Par associativit cette expression peut galement s crire salade poulet fromage salade poulet fromage donc il nous faut d finir deux autres lois une loi Plat x float float une loi float x Plat float La premi re se programme en d clarant une nouvelle fonction membre 12 fl
14. Meneur et une classe Joueur 2 5 3 2 e tape fiches descriptives des classes Il nous faut d terminer les donn es et fonctions membres de chaque classe Le meneur d tient un num ro secret Ses actions sont choisir ce num ro r pondre par un diagnostic c est plus c est moins ou c est exact D o la fiche descriptive suivante classe Meneur public L_ nunsecret Choisis Reponds Le joueur d tient un nombre sa proposition Son unique action est de proposer ce nombre Mais au cours du jeu il doit garder l esprit une fourchette dans laquelle se situe le num ro deviner ce qui nous am ne la fiche descriptive suivante 13 classe Joueur LL proposition Propose 2 5 4 3 tape description d taill e des fonctions membres Nous allons d crire le fonctionnement de chaque fonction membre et en pr ciser les informations d entr e et de sortie voir 2 2 2 Choisis de Meneur entr e rien sortie rien e choisit la valeur de numsecret entre 1 et 100 On remarque que ce choix ne se fait qu une fois au d but de la partie Il est donc logique que ce soit le constructeur qui s en charge Nous transformerons donc cette fonction en constructeur Reponds de Meneur entr e la proposition du joueur sortie un diagnostic exact plus ou moins que nous coderons respectivement par 0 1 ou 2 e compa
15. but du tableau si n cessaire 31 temp T tete tete taille idem pleine 0 vide tete queue return temp Voici par exemple comment nous pourrions utiliser la classe Queue e cr ation d une file d attente contenant au plus 1000 l ments Queue q new Queue 1000 e mise d un l ment dans la file if q gt Pleine q gt Mets pObjet p bjet pointe sur un Objet suppos cr par ailleurs e extraction d un l ment de la file if 1 q gt Vide pObjet q gt Extrais e destruction de la file delete q 32 Chapitre 4 ENTREES amp SORTIES ios istream ostream E ifstream ofstream 4 1 La librairie iostream h 4 1 1 La classe istream En C un fichier est consid r comme un flot en anglais stream c est dire une suite d octets repr sentant des donn es de m me type Si ces octets repr sentent des caract res on parle de fichier texte si ces octets contiennent un codage en binaire on parle de fichier binaire Les organes logiques clavier console cran sont vus comme des fichiers textes Les flots en entr e sont d crits par la classe istream L objet cin est une instance de cette classe automatiquement cr et destin aux entr es depuis le clavier 4 1 2 En plus de lop rateur de lecture gt gt que nous avons d j utilis la classe istream dispose de nombreuses fonctions dont les suivantes e get 1
16. du crayon pDC gt MoveTo 200 100 d placement du crayon pDC gt LineTo 400 380 trac d un segment pDC gt LineTo 180 250 pDC gt LineTo 200 100 pDC gt SelectObject ancien restitution de l ancien crayon Compiler puis ex cuter le projet L application est op rationnelle Modifier la couleur du trac pour qu elle soit choisie al atoirement COLORREF couleur RGB rand 256 rand 256 rand 256 Ajouter dans le constructeur de la vue l initialisation du g n rateur de nombres al atoires srand unsigned time NULL Compiler puis ex cuter On peut remarquer que lorsqu on redimensionne la fen tre ou lorsqu on en d couvre une partie apr s l avoir recouverte par une autre fen tre le triangle change partiellement de couleur l ordre OnDraw est envoy directement la vue par le syst me d exploitation avec indication d une r gion de mise jour 5 3 Am lioration de l interface Pour ajouter un l ment l interface le principe consiste ajouter ou modifier une ressource menu dialogue etc celle ci d crit l aspect de l l ment ajouter ventuellement une classe pour g rer l l ment cas d un dialogue ajouter le gestionnaire ad quat dans la classe destinataire du message envoy par l l ment 5 3 1 Ajouter un menu a Dans l onglet ResourceView ouvrir le dossier Menu et double cliquer sur IDR _MAINFRAME identifica
17. forme d clar e ainsi istream amp get char amp destination C est la lecture d un caract re La fonction renvoie une r f rence sur le flot en cours ce qui permet d encha ner les lectures Exemple char c short nb cin get c gt gt nb si on tape 123 entr e c re oit 1 nb re oit 23 e get 2 forme d clar e ainsi istream amp get char tampon int longueur char delimiteur n Lit au plus longueur caract res jusqu au d limiteur inclus et les loge en m moire l adresse point e par tampon La cha ne lue est compl t e par un 0 Le d limiteur n y est pas inscrit mais est remis dans le flot d entr e Exemple char tampon 10 cin get tampon 10 e get 3 forme d clar e ainsi int amp get 33 Lit un seul caract re transtyp en int On peut par exemple r cup rer le caract re EOF marque de fin de fichier qui correspond l entier 1 Exemple int c while c cin get q cout lt lt char c e getline d clar e ainsi istream amp getline char tampon int longueur char delimiteur n Lit une ligne A la diff rence du get 2 forme le d limiteur est absorb au lieu d tre remis dans le flot d entr e e ignore d clar e ainsi istream amp ignore int longueur 1 int delimiteur EOF Elimine des caract res du flot d entr e fonctionne comme getline Ex
18. incurv e permet d arracher quelque chose D o la fiche descriptive nom marteau l ments fonctions manche saisir extr mit plate frapper extr mit incurv e arracher Pour v rifier que nous n avons rien oubli d important dans une telle fiche descriptive il faut imaginer l objet l uvre dans une petite sc ne Le d roulement de l action peut alors r v ler des composants qui nous auraient chapp en premi re analyse dans notre exemple quatre acteurs un marteau un clou un mur et un individu pour planter le clou dans le mur l individu saisit le marteau par son manche puis frappe sur le clou avec l extr mit plate il s aper oit alors que le clou est mal plac et l arrache avec l extr mit incurv e 1 1 4 Prenons comme deuxi me exemple un chronom tre digital B A Ce chronom tre comporte un temps qui s affiche et deux boutons et B Quand on presse sur A on d clenche le chronom tre ou bien on l arr te Quand on presse sur B on remet z ro le chronom tre D o la fiche descriptive nom chronom tre l ments fonctions boutons B afficher temps presser sur un bouton d clencher arr ter remettre z ro Remarquons que l utilisateur ne peut pas modifier directement le temps affich il n a acc s ce temps que de mani re indirecte par l interm diaire des fonctions de l objet Cette notion
19. lt lt proposition lt lt n return proposition 3 4 5 Traitement principal include meneur h include meneurhu h include meneuror h include joueur h include joueurhu h include joueuror h include lt iostream h gt void main cout lt lt n n tJEU DU C C n n Joueur j Meneur m distribution des r les char rep cout lt lt Qui est le meneur h humain o ordinateur cin gt gt rep if rep h m new MeneurHumain else 28 m new Meneur0Ordinateur cout lt lt Qui est le joueur h humain o ordinateur cin gt gt rep if rep h j new JoueurHumain else j new JoueurOrdinateur d roulement de la partie int p d 1 cpt 0 do p j gt Propose d d m gt Reponds p cpt while d amp amp cpt lt 6 affichage du r sultat cout lt lt nVainqueur if d m gt AfficheNom else j gt AfficheNom 3 5 H ritage multiple 3 5 1 En C il est possible de faire d river une classe de plusieurs autres classes simultan ment On d clarera par exemple class C public A public B La classe C h rite alors de A et B une instance de la classe C poss de la fois les donn es et fonctions membres de la classe A et celles de la classe B 3 5 2 Quand un objet de la classe C ci dessus est cr les constructeurs des classes parentes sont appel s d ab
20. rence sur le flot en cours ce qui permet d encha ner les critures Exemple cout put C put put affiche C e seekp d clar e ainsi ostream amp seekp streampos p Acc s direct la position p pour criture Comme pour seekg on peut mettre un second param tre voir 6 1 2 e write d clar e ainsi ostream amp write const void donnees sizet taille Ecrit taille octets provenant de l adresse donnees e pgcount d clar e ainsi sizet pcount Renvoie le nombre d octets crits avec write 4 1 5 Utilitaires sur les caract res Voici quelques fonctions d clar es dans lt ctype h gt concernant les caract res tolower convertit une lettre majuscule en minuscule toupper convertit une lettre minuscule en majuscule isalpha teste si un caract re est une lettre islower teste si un caract re est une lettre minuscule isupper teste si un caract re est une lettre majuscule isdigit teste si un caract re est un chiffre entre 0 et 9 isalnum teste si un caract re est une lettre ou un chiffre 4 2 La librairie fstream h 4 2 1 La classe ifstream Cette classe d crit les fichiers en lecture Elle d rive de istream donc dispose des fonctions du paragraphe pr c dent ainsi que des fonctions suivantes e un constructeur d clar ifstream const char nom int mode ios in Cr e un nouvel objet de type ifstream lui attache le fichier disque appel n
21. servir de l appareil d une autre mani re ou d autres fins que celles pr vues par le con structeur Nous retiendrons donc que pour d crire un objet usuel il faut d crire ses composants savoir 1 les diff rents l ments qui le constituent 2 les diff rentes fonctions associ es ces l ments 1 1 2 Les l ments qui constituent l objet d finissent chaque instant l tat de l objet on peut dire son aspect spatial Les fonctions quant elles d finissent le comportement de l objet au cours du temps Les l ments qui constituent l objet peuvent se modifier au cours du temps par exemple le voyant d une cafeti re peut tre allum ou teint Un objet peut ainsi avoir plusieurs tats Le nombre d tats possibles d un objet donne une id e de sa complexit 1 1 3 Pour identifier les composants d un objet usuel une bonne m thode consiste faire de cet objet une description litt rale puis de souligner les principaux noms communs et verbes Les noms communs donnent les l ments constituants les verbes donnent les fonctions Ilustrons cette m thode dans le cas d un objet tr s simple un marteau On peut en faire la description suivante Ce marteau comporte un manche en bois une extr mit plate en m tal et une extr mit incurv e galement en m tal Le manche permet de saisir le marteau l extr mit plate permet de frapper quelque chose et l extr mit
22. type Moteur La relation utilise un est une collaboration entre classes ind pendantes Elle se traduit le plus souvent par des pointeurs Par exemple un objet de type Voiture renfermera une donn e membre de type pointeur sur Route ce qui permettra la voiture de communiquer avec une route cf 2 6 3 La relation est un s appelle un h ritage une voiture h rite des caract ristiques communes tout v hicule On dira que la classe Voiture est d riv e de la classe Vehicule 3 2 Classes d riv es 3 2 1 Le principe est d utiliser la d claration d une classe appel e classe de base ou classe parente comme base pour d clarer une seconde classe appel e classe d riv e La classe d riv e h ritera de tous les membres donn es et fonctions de la classe de base Consid rons par exemple la d claration suivante class Base public short membreBase void SetmembreBase short valeurBase On d clare une classe d riv e de la classe Base gr ce au qualificatif public Base Par exemple class Derivee public Base h ritage public public short membreDerivee void SetmembreDerivee short valeurDerivee fs Un objet de la classe Derivee poss de alors ses propres donn es et fonctions membres plus les donn es membres et fonctions membres h rit es de la classe Base 19 classe Derivee membreDerivee SetmembreDerivee membreBase membreBase SetmembreBase Setmembr
23. Cours d informatique 2003 2004 C PROGRAMMATION OBJET SOMMAIRE Chapitre 1 Le concept d objet 1 1 1 Objet usuel 1 1 2 Objet informatique Classe 2 1 3 Encapsulation 3 1 4 Strat gie D D U 4 1 5 Mise en uvre 5 Chapitre 2 Programmation des classes podoi w 8 2 1 Un exemple 8 2 2 Fonctions membres bn lee titles EUR A amp g 2 3 Constructeurs et destructeurs 10 2 4 Surcharge des op rateurs de mo ui st T 2 5 R alisation d un programme n DR gouter ft te 13 2 6 Pointeurs et objets Li ce et de ee e 4 AT Chapitre 3 H ritage Je c 2 D Se Rs ju 19 3 1 Relations a un est un utilise un 19 3 2 Classes d riv es DL el a SA mt GS amp t O 3 3 Polymorphisme DR Ae i a ean ae a RL 4 100 3 4 Exemple Lee Sa Me D an a a ice he 4 24 3 5 H ritage multiple 29 3 6 Classes abstraites 80 Chapitre 4 Entr es amp sorties Re AS 00639 4 1 La librairie iostream h 33 4 2 La librairire fstream h 35 4 3 Fonctions de contr le 36 4 4 Surcharge des op rateurs gt gt et lt lt 37 4 5 Formatage des donn es 38 Appendice 89 A 1 Relation d amiti 39 A 2 Patrons g ac dro 4 4 28 tit at amp 9 4e 48 340 Chapitre 5 Introduction la programmation Windows
24. Destructeurs Un destructeur est une fonction membre d clar e du m me nom que la classe mais pr c d d un tilda et sans type ni param tre TNom_classe Fonctionnement l issue de l ex cution d un bloc le destructeur est automatiquement appel pour chaque objet de la classe Nom_classe d clar dans ce bloc Cela permet par exemple de programmer la restitution d un environnement en lib rant un espace m moire allou par l objet Nous n en ferons pas souvent usage 2 4 Surcharge des op rateurs 2 4 1 En C on peut surcharger la plupart des op rateurs usuels du langage c est dire les repro grammer pour que dans un certain contexte ils fassent autre chose que ce qu ils font d habitude Ainsi dans l exemple 2 1 1 nous avons surcharg l op rateur d addition pour pouvoir l appliquer deux nombres complexes et calculer leur somme Notons galement que les op rateurs d entr es sorties lt lt et gt gt sont en r alit les surcharges de deux op rateurs de d calages de bits appel s respectivement shift left et shift right La surcharge d un op rateur lt op gt se fait en d clarant au sein d une classe Ma_classe une fonction membre appel e operator lt op gt Plusieurs cas peuvent se pr senter selon que lt op gt est un op rateur unaire c est dire un argument ou binaire c est a dire deux arguments Nous allons voir quelques exem
25. ait gr ce un couple d entiers h v form d une coordonn e horizontale et d une coordonn e verticale L origine 0 0 est en haut gauche de la vue l axe vertical est dirig vers le bas Les instructions graphiques sont donn es un objet dessinateur appel contexte graphique ou Device Context de la classe CDC 5 1 4 ClassWizard Cet assistant de classe permet en cours de d veloppement de cr er des classes ou de les modifier On s en sert notamment pour ajouter donn es fonctions membres et gestionnaires c est dire des fonctions charg es de r pondre des v nements comme clic sur la souris s lection d un menu choix d un bouton de contr le etc On peut activer ClassWizard tout moment par la combinaison de touches lt CTRL gt W 42 5 2 Premier exemple Nous commen ons par crire un programme qui dessine un triangle Voici les principales tapes a b c d e g Cr er un nouveau projet appel Triangle de type MFC AppWizard exe Single Document Dans l onglet ClassView en cliquant sur les faire appara tre la classe CTriangleView et double cliquer sur la fonction OnDraw Ajouter dans la fonction OnDraw le code suivant COLORREF couleur RGB 0 0 0 couleur noire int epaisseur 10 paisseur du trait CPen crayon PS_SOLID epaisseur couleur cr ation d un crayon CPen ancien pDC gt SelectObject amp crayon s lection
26. ans la d finition de la fonction operator les donn es membres de l objet g sont d sign es par la notation point e habituelle savoir g re et g im 1 5 2 Notons au passage que bien que ces donn es soient priv es elles sont accessibles ce niveau puisque nous sommes dans la d finition de la classe Complexe 2 2 2 Flux de l information Chaque fonction membre est une unit de traitement correspondant une fonctionnalit bien pr cise et qui sera propre tous les objets de la classe Pour faire son travail lors d un appel cette unit de traitement dispose des informations suivantes les valeurs des donn es membre publiques ou priv es de l objet auquel elle appartient 9 les valeurs des param tres qui lui sont transmises En retour elle fournit un r sultat qui pourra tre utilis apr s l appel Ainsi Avant de programmer une fonction membre il faudra identifier quelle est l information qui doit y entrer param tres et celle qui doit en sortir r sultat 2 3 Constructeurs et destructeurs 2 3 1 Un constructeur est une fonction membre d clar e du m me nom que la classe et sans type Nom_classe lt param tres gt Fonctionnement l ex cution l appel au constructeur produit un nouvel objet de la classe dont on peut pr voir l initialisation des donn es membres dans la d finition du constructeur Exemple avec la classe Complexe d crite en 2 1 1 l express
27. cteur private ClassB bi b2 deux objets de la classe ClassB J alors la cr ation d un objet de la classe Class_A le constructeur par d faut de Class B s il existe est automatiquement appel pour chacun des objets b1 b2 on dit qu il y a des initialisations en cha ne Mais pour ces initialisations il est galement possible de faire appel un constructeur param tr de Class_B condition de d finir le constructeur de Class_A de la mani re suivante Class_A Class_A bi b2 lt instruction bloc gt 10 Dans ce cas l appel au constructeur de Class_A provoquera l initialisation des donn es membres b1 b2 par appel au constructeur param tr de Class_B avant l ex cution de l lt instruction bloc gt 2 3 4 Conversion de type Supposons que Ma_classe comporte un constructeur un param tre de la forme Ma_ classe Mon type x o Mon_type est un type quelconque Alors chaque fois que le besoin s en fait sentir ce constructeur assure la conversion automatique d une expression e de type Mon type en un objet de type Ma classe savoir Ma_classe e Par exemple si nous avons dans la classe Complexe le constructeur suivant Complexe Complexe float x alors ce constructeur assure la conversion automatique float Complexe ce qui nous permet d crire des instructions du genre zi 1 0 z3 z2 2 0 z1 z2 z3 suppos s de type Complexe 2 3 5
28. d acc s indirect jouera un r le important dans la suite 1 3 1 2 Objet informatique Classe 1 2 1 L ordinateur est un appareil poss dant une tr s grande complexit li e un tr s grand nombre d tats et un comportement tr s vari li la fa on dont on le programme Il nous servira d objet universel capable de simuler la plupart des objets usuels 1 2 2 Programmer un ordinateur c est lui fournir une s rie d instructions qu il doit ex cuter Un langage de programmation volu doit simplifier le travail du programmeur en lui offrant la possibilit 2 d crire son programme sous forme de petits modules autonomes de corriger et faire voluer son programme avec un minimum de retouches d utiliser des modules tout faits et fiables De ce point de vue les langages objets comme le C sont sup rieurs aux langages classiques comme le C car ils font reposer le gros du travail sur des briques logicielles intelligentes les objets Un programme n est alors qu une collection d objets mis ensemble par le programmeur et qui coop rent un peu comme les joueurs d une quipe de football supervis s par leur entra neur 1 2 3 Transpos en langage informatique 1 1 1 donne Un objet est une structure informatique regroupant des variables caract risant l tat de l objet des fonctions caract risant le comportement de l objet Les variables re
29. de e Dans cette fonction ajouter les deux instructions mactif true InvalidateRect NULL invalide la vue lle sera redessin f Compiler et ex cuter la commande Go du menu Triangles lance le trac 5 3 3 Utiliser un dialogue pr d fini Nous d sirons choisir la couleur du fond gr ce un dialogue standard de s lection de couleur a Dans la vue ajouter la donn e membre priv e m couleurfond de type COLORREF b Dans le constructeur crire m_couleurfond RGB 255 255 255 initialement blanc c Dans OnDraw ajouter le code suivant CRect r d clare un rectangle r GetClientRect r r re oit le rectangle de la vu CBrush pinceau m_couleurfond construit un pinceau CBrush pvieux pDC gt SelectObject amp pinceau le s lectionne pDC gt FillRect r amp pinceau peint le rectangle r Me trac du triangle pDC gt SelectObject pvieux restitue l ancien pinceau d Activer ClassWizard et ajouter le gestionnaire comme en 5 3 2 d pour la commande Fond avec le code suivant CColorDialog d d dialogue de la classe CColorDialog if d DoModal IDOK si on cliqu sur le bouton OK m_couleurfond d GetColor on r cup re la couleur InvalidateRect NULL on retrace la vue e Compiler et tester 44 5 3 4 Cr er un nouveau dialogue Nous d sirons tracer plusieurs triangles leur nombre tant saisi dans un dialo
30. deux complexes gr ce l op rateur cout lt lt n nLa somme de zi Affiche cout lt lt et z2 Affiche cout lt lt est z3 Affiche 2 1 2 Remarques Les constructeurs permettent d initialiser les objets Nous verrons plus pr cis ment leur usage au para graphe 3 Nous reviendrons galement sur la surcharge des op rateurs paragraphe 4 Dans ce programme nous donnons l exemple de l op rateur qui est red fini pour permettre d additionner deux nombres complexes Cela permet ensuite d crire tout simplement z3 z1 z2 entre nombre complexes Cette possibilit de red finir on dit aussi surcharger les op rateurs usuels du langage est un des traits importants du C 2 2 Fonctions membres 2 2 1 L objet implicite Rappelons que pour d crire une classe cf 1 2 5 on commence par d clarer les donn es et fonctions membres d un objet de cette classe puis on d finit les fonctions membres de ce m me objet Cet objet n est jamais nomm il est implicite au besoin on peut y faire r f rence en le d signant par this Ainsi dans l exemple du paragraphe 2 1 1 lorsqu on crit les d finitions des fonctions membres de la classe Complexe on se r f re directement aux variables re et im et ces variables sont les donn es membres du nombre complexe implicite qu on est en train de programmer et qui n est jamais nomm Mais s il y a un autre nombre complexe comme g d
31. diag endif 25 ifndef _MENEURHUH define _MENEURHUH include meneur h class MeneurHumain public Meneur public MeneurHumain int Reponds int prop endif ifndef _MENEURORH define _MENEURORH include meneur h class MeneurOrdinateur public Meneur public MeneurOrdinateur int Reponds int prop private int numsecret ifndef _JOUEURHUH define _JOUEURHUH include joueur h class JoueurHumain public Joueur public JoueurHumain int Propose int diag ifndef _JOUEURORH define _JOUEURORH include joueur h class JoueurOrdinateur public Joueur public JoueurOrdinateur int Propose int diag private int min max proposition endif 3 4 4 D finitions des classes include acteur h include lt iostream h gt 26 void Acteur AfficheNom cout lt lt nom include meneur h int Meneur Reponds int prop rien ce niveau include joueur h int Joueur Propose int diag rien ce niveau include meneurhu h include lt iostream h gt MeneurHumain MeneurHumain cout lt lt Vous faites le meneur Quel est votre nom cin gt gt nom cout lt lt Choisissez un num ro secret entre 1 et 100 n n int MeneurHumain Reponds int prop AfficheNom cout lt lt indiquez votre r ponse int r cout lt lt n0 C est exact cout
32. eBase 3 2 2 Contr le des acc s Il est possible de r server l acc s certaines donn es ou fonctions membres de la classe de base aux seules classes d riv es en leur mettant le qualificatif protected retenir Les donn es et fonctions membres priv es sont inaccessibles aux classes d riv es 3 2 3 Premier exemple include lt iostream h gt class Base public void SetmembreBase short valeurBase protected short membreBase void Base SetmembreBase short valeurBase membreBase valeurBase class Derivee public Base public void SetmembreDerivee short valeurDerivee void AfficheDonneesMembres void private short membreDerivee P void Derivee SetmembreDerivee short valeurDerivee membreDerivee valeurDerivee void Derivee AfficheDonneesMembres void cout lt lt Le membre de Base a la valeur lt lt membreBase lt lt n cout lt lt Le membre de Derivee a la valeur lt lt membreDerivee lt lt n void main Derivee ptrDerivee ptrDerivee new Derivee ptrDerivee gt SetmembreBase 10 message 1 ptrDerivee gt SetmembreDerivee 20 message 2 ptrDerivee gt AfficheDonneesMembres message 3 A lex cution ce programme affichera les deux lignes suivantes Le membre de Base a la valeur 10 Le membre de Derivee a la valeur 20 3 2 4 H ritage public ou priv Il est possible de d clarer
33. emple char tampon 80 cin ignore 3 getline tampon 80 e peek d clar e ainsi int peek Lit le caract re suivant sans l enlever fonctionne comme get 3 forme e putback d clar e ainsi istream amp putback char c Remet le caract re d sign par c dans le flot ce caract re doit tre le dernier avoir t lu e seekg d clar e ainsi istream amp seekg streampos p Acc s direct au caract re num ro p ce qui permettra sa lecture les caract res sont num rot s partir de 0 On peut pr ciser une position relative en mettant en second param tre ios beg ios cur ou ios end e read d clar e ainsi istream amp read void donnees int taille Lecture de taille octets depuis le flot et stockage l adresse donnees e gcount d clar e ainsi sizet gcount Renvoie le nombre d octets lus avec succ s avec read 4 1 3 La classe ostream Cette classe est destin e d crire les flots en sortie L objet cout est une instance de cette classe automatiquement cr et destin aux sorties l cran cerr et clog en sont galement deux instances g n ralement associ es la console 4 1 4 En plus de l op rateur d criture lt lt que nous avons d j utilis la classe ostream dispose de nombreuses fonctions dont les suivantes e put d clar e ainsi ostream amp put char c 34 Ecrit le caract re sp cifi et renvoie une r f
34. ependant la forcer par l op rateur de conversion de type en crivant pb B pa e l affectation pv pa est correcte comme d ailleurs pv pb l affectation pa pv est ill gale mais peut tre forc e par pa A pv 3 3 5 Op rateur de port e Lorsqu une fonction membre virtuelle f d une classe A est surcharg e dans une classe B d riv e de A un objet b de la classe B peut faire appel aux deux versions de f la version d finie dans la classe B elle s crit simplement f ou la version d finie dans la classe parente elle s crit alors A f o est l op rateur de port e 3 4 Exemple 3 4 1 Reprenons le programme de jeu c est plus c est moins du chapitre 2 85 Nous pouvons main tenant crire une version dans laquelle au moment de l ex cution les r les du joueur et du meneur seront attribu s soit un humain soit l ordinateur L ordinateur pourra donc jouer contre lui m me Il est important de noter que le d roulement de la partie qui tait contr l par la boucle do voir la fonction main paragraphe 2 5 7 p j Propose d proposition du joueur d m Reponds p diagnostic du meneur while d amp amp cpt lt 6 s crira de la m me fa on dans cette nouvelle version quelle que soit l attribution des r les Cela est possible gr ce au polymorphisme des fonctions Propose et Reponds 24 Nous utiliserons la hi
35. etnom lt lt F lt lt article Getprix lt lt return os idem void main lit des plats depuis un fichier et les affiche l cran ifstream menu MENU TXT Plat article while menu gt gt article cout lt lt article lt lt n menu close 37 4 5 Formatage des donn es 4 5 1 Indicateurs Les indicateurs suivants permettent de contr ler l aspect des donn es en sortie left alignement gauche right alignement droite fixed flottants en virgule fixe scientific flottants en notation scientifique showpoint force l affichage avec virgule d un flottant showpos force l affichage d un devant un entier positif L indicateur suivant permet de modifier le comportement de l op rateur de lecture skipws saute les blancs Ces indicateurs de format sont membres de la classe ios et peuvent tre r gl s par les fonctions membres setf et unsetf setf ios lt flag gt active l indicateur lt flag gt unsetf ios lt flag gt d sactive l indicateur lt flag gt Exemple cin setf ios skipus saute les blancs en lecture au clavier cin unsetf ios skipws ne saute pas les blancs en lecture au clavier 4 5 2 Fonctions utiles width d termine le nombre minimum de caract res de la prochaine sortie fi110 pr cise le caract re de remplissage precision d termine le nombre de chiffres Exemple cout width 12 cout fill1l x
36. gue a b c d e f g h i j k D Dans l onglet ResourceView cliquer avec le bouton droit de la souris sur le dossier Dialog Au menu contextuel demander InsertDialog Un nouveau dialogue appara t avec deux boutons Cliquer avec le bouton droit sur ce nouveau dialogue Au menu contextuel demander Properties Entrer d abord l intitul du dialogue champ Caption puis taper ID_DIALOGNOMBRE champ ID A la souris et avec l aide de la palette d outils placer une tiquette Static Text d intitul Nombre A c t placer une zone de texte ditable Edit Box et lui attribuer l identificateur IDC_NOMBRE Demander Tab Order au menu Layout et cliquer sur les l ments du contr le dans l ordre o nous voulons pouvoir les activer l ex cution avec la touche lt TAB gt Double cliquer sur le dialogue Cela active ClassWizard et permet de cr er une nouvelle classe g rant le dialogue Nommer cette classe CDialogNombre Sous ClassWizard onglet Member Variables double cliquer sur IDC _ NOMBRE ClassWizard nous propose de cr er une donn e membre associ e la zone de texte ditable Entrer son nom m_nb sa cat gorie Value son type int Ajouter l initialisation de cette donn e membre dans le constructeur de la classe CDialogNombre Dans la classe CTriangleView ajouter une donn e membre m_nb de type int l initialiser dans le constructeur Dans cette m me c
37. ion Complexe 1 0 2 0 a pour valeur un nombre complexe de partie r elle 1 et de partie imaginaire 2 Dans une classe il peut y avoir plusieurs constructeurs condition qu ils diff rent par le nombre ou le type des param tres Un constructeur sans param tre s appelle constructeur par d faut 2 3 2 Initialisation des objets Dans une classe il est possible ne pas mettre de constructeur Dans ce cas lors de la d claration d une variable de cette classe l espace m moire est r serv mais les donn es membres de l objet ne re oivent pas de valeur de d part on dit qu elles ne sont pas initialis es Au besoin on peut pr voir une fonction membre publique pour faire cette initialisation En revanche S il y a un constructeur il est automatiquement appel lors de la d claration d une variable de la classe Exemples avec la classe Complexe d clar e en 2 1 1 Complexe z appel automatique du constructeur par d faut quivaut Complexe z Complexe Complexe z 1 0 2 0 appel du constructeur param tr quivaut Complexe z Complexe 1 0 2 0 On retiendra que L utilit principale du constructeur est d effectuer des initialisations pour chaque objet nouvellement cr 2 3 3 Initialisations en cha ne Si une classe Class A contient des donn es membres qui sont des objets d une classe Class_B par exem ple class Class_A public Class_A constru
38. lasse ajouter et programmer le gestionnaire associ la commande de menu Nombre s inspirer de 5 3 2 d ainsi que la directive d inclusion include DialogNombre h Modifier enfin le code de OnDraw pour tracer m_nb triangles al atoires chacun tant obtenu par int h v pDC gt MoveTo h rand 400 v rand 400 pDC gt LineTo rand 400 randi 400 pDC gt LineTo rand 400 rand 400 pDC gt LineToi h v Compiler et ex cuter L sans om tone ANT Fichier Edition Afichage 2 Triangles DH e Nombre Fond Go x EER Nombre q E Cancel mey 45
39. les adapter ses propres besoins 3 3 Polymorphisme 3 3 1 Dans l exemple pr c dent AfficheAire de Carre r utilise le code de AfficheAire de Rect angle Mais dans d autres cas il peut tre n cessaire d crire un code diff rent Par exemple dans une hi rarchie de classes de ce genre Forme ARS Rectangle Cercle Triangle Carre 22 on a une version de AfficheAire pour chacune de ces classes Si ensuite on cr e une collection d objets de type Forme en demandant AfficheAire pour chacune de ces formes ce sera automatiquement la version correspondant chaque forme qui sera appel e et ex cut e on dit que AfficheAire est polymorphe Ce choix de la version ad quate de AfficheAire sera r alis au moment de l ex cution Toute fonction membre de la classe de base devant tre surcharg e c est dire red finie dans une classe d riv e doit tre pr c d e du mot virtual 3 3 2 Exemple include lt iostream h gt class Forme donn es et fonctions membres public virtual void QuiSuisJe void fonction destin e tre surcharg e void Forme QuiSuisJe cout lt lt Je ne sais pas quel type de forme je suis n class Rectangle public Forme donn es et fonctions membres public void QuiSuisJe void 35 void Rectangle QuiSuisJe cout lt lt Je suis un rectangle n class Triangle public Forme donn es et f
40. oat operator float u que nous d finissons par float Plat operator float u La deuxi me ne peut pas se programmer avec une fonction membre de la classe Plat puisqu elle s adresse un float Nous sommes contraints de d clarer une fonction libre c est dire hors de toute classe return prix u float operator float u Plat p que nous d finissons par float operator float u Plat p return u p Getprix 2 5 R alisation d un programme 2 5 1 Sur un exemple nous allons d tailler les diff rentes tapes qui m nent la r alisation d un pro gramme Il s agira de simuler le jeu du c est plus c est moins o un joueur tente de deviner un nombre choisi par le meneur de jeu Le fait de programmer avec des objets nous force mod liser soigneusement notre application avant d aborder le codage en C 2 5 2 1 tape identification des classes Conform ment 1 1 3 nous commen ons par d crire le jeu de mani re litt rale Le jeu oppose un joueur un meneur Le meneur choisit un num ro secret entre 1 et 100 Le joueur propose un nombre Le meneur r pond par c est plus c est moins ou c est exact Si le joueur trouve le num ro secret en six essais maximum il gagne sinon il perd J zi P Le jeu r unit deux acteurs avec des r les diff rents un meneur et un joueur Nous d finirons donc deux classes une classe
41. om et ouvre ce fichier en lecture Exemple d utilisation ifstream monfic A TOTO TXT qu on peut crire de mani re quivalente ifstream monfic monfic open A TOTO TXT variante avec la fonction open Il est possible d ouvrir le fichier en mode ajout en anglais append pour pouvoir y ajouter des l ments la fin Il suffit pour cela de passer au constructeur comme second param tre ios app e close qui ferme le fichier en fin de traitement 39 4 2 2 La classe ofstream Cette classe d crit les fichiers en criture Elle d rive de ostream donc dispose des fonctions du para graphe pr c dent ainsi que des fonctions suivantes e un constructeur d clar ofstream const char nom int mode ios out Cr e un nouvel objet de type ofstream lui attache un fichier disque appel nom et ouvre ce fichier en criture e close qui ferme le fichier en fin de traitement 4 2 3 Exemple Voici une fonction qui recopie un fichier texte void Copie char nomSource char nomDestination ifstream source nomSource ofstream destination nomDestination char c cout lt lt nD but de la copie while source get c explication en 4 3 2 destination lt lt c source close destination close cout lt lt nCopie achev e Remarquer qu il ne faudrait pas lire les caract res de source par source gt gt cC car l op rateur gt gt sauterait le
42. on return ptablindex 5 A 2 2 Exemple d utilisation de la classe Tableau pr c dente Tableau lt int gt t 10 d clare un tableau t contenant 10 entiers 40 int Z z t 1 ici l indice est automatiquement contr l t 0 1 possible car la surcharge de est d clar e de type T amp Ou bien Tableau lt float gt u 3 d clare un tableau u contenant 3 r els Ou encore typedef char Mot 20 Tableau lt Mot gt t 100 d clare un tableau t contenant 100 mots Remarques le param tre de type T peut tre n importe quel type type de base type d fini ou classe chacune des d clarations pr c dentes provoque en r alit la recompilation de la classe Tableau o le type param tre T est remplac par le type v ritable une autre mani re d crire une classe Tableau pouvant contenir diff rents types d objets est d utiliser l h ritage et le polymorphisme comme nous l avons fait pour les classes Boite Pile et Queue au paragraphe 3 6 3 41 Chapitre 5 INTRODUCTION A LA PROGRAMMATION WINDOWS AVEC VISUAL C 5 1 Outils 5 1 1 Biblioth que MFC Toute application Windows doit s ex cuter dans un univers coop ratif multi t che et r pondre des v nements pr cis clics de souris frappe du clavier etc Pour faciliter la programmation d une telle application MicrosoftTM distribue une biblioth que de classes toutes faites les Microsoft Foundation Classes
43. on obiet l utilit principale des pointeurs est de permettre deux objets de communiquer directement entre eux On peut galement construire des listes cha n es d objets de la m me classe en d clarant class C private C lien donn e membre pointeur sur un objet de la classe C Une telle liste peut tre repr sent e par le sch ma suivant objet de type C objet de type C objet de type C L J E ee 18 Chapitre 3 HERITAGE 3 1 Relations a un est un utilise un 3 1 1 Dans le cadre d un programme concernant les transports supposons que nous d clarions les quatre classes suivantes Voiture Moteur Route et Vehicule Quel genre de relation y a t il entre la classe Voiture et les trois autres classes Tout d abord on peut dire qu une voiture a un moteur le moteur fait partie de la voiture il est contenu dans celle ci Ensuite une voiture utilise une route mais il n y a pas d inclusion la route ne fait pas partie de la voiture de m me que la voiture ne fait pas partie de la route Enfin une voiture est un v hicule d un genre particulier la voiture poss de toutes les caract ristiques d un v hicule plus certaines caract ristiques qui lui sont propres 3 1 2 Du point de vue de la programmation la relation a un est une inclusion entre classes Ainsi un objet de type Voiture renferme une donn e membre qui est un objet de
44. onctions membres public void QuiSuisJe void void Triangle QuiSuisJe cout lt lt Je suis un triangle n void main Forme s char c cout lt lt Voulez vous cr er 1 un rectangle n cout lt lt 2 un triangle n cout lt lt 3 une forme quelconque n cin gt gt c switch c case 1 s new Rectangle break case 2 s new Triangle break case 3 s new Forme s gt QuiSuisJe cet appel est polymorphe Remarque Pour le compilateur l instruction marqu e il est impossible de savoir quelle version de QuiSuisJe il faut appeler cela d pend de la nature de la forme cr e donc le choix ne pourra tre fait qu au moment de l ex cution on appelle cela choix diff r ou late binding en anglais 23 3 3 3 Remarques Une fonction d clar e virtuelle doit tre d finie m me si elle ne comporte pas d instruction Un constructeur ne peut pas tre virtuel Un destructeur peut l tre 3 3 4 Compatibilit de types Supposons d clar class B public A ou private A a B b pa B pb void xpv Alors e l affectation a b est correcte elle convertit automatiquement b en un objet de type A et affecte le r sultat a l affectation inverse b a est ill gale e de la m me mani re l affectation pa pb est correcte l affectation inverse pb pa est ill gale on peut c
45. ord celui de A ensuite celui de B Quand un objet est d truit les destructeurs des classes parentes sont appel s d abord celui de B ensuite celui de A 3 5 3 Dans la situation ci dessus il peut arriver que des donn es ou fonctions membres des classes A et B aient le m me nom Pour lever l ambigu t on utilise l op rateur de port e en crivant par exemple A x pour d signer la donn e membre x h rit e de la classe A et B x pour d signer celle qui est h rit e de la classe B 29 3 6 Classes abstraites 3 6 1 Une fonction membre virtuelle d une classe est dite purement virtuelle lorsque sa d claration est suivie de 0 comme ci dessous class A Une fonction purement virtuelle n a pas de d finition dans la classe Elle ne peut qu tre surcharg e dans les classes d riv es 3 6 2 Une classe comportant au moins une fonction membre purement virtuelle est appel e classe ab straite retenir Aucune instance d une classe abstraite ne peut tre cr e L int r t d une classe abstraite est uniquement de servir de canevas ses classes d riv es en d clarant l interface minimale commune tous ses descendants 3 6 3 Exemple Il n est pas rare qu au cours d un programme on ait besoin de stocker temporairement des informa tions en m moire pour un traitement ult rieur Une structure de stockage doit permettre deux actions principales mettre un nouvel l ment
46. ples 2 4 2 Cas d un op rateur unaire Nous voulons surcharger l op rateur unaire pour qu il calcule l oppos d un nombre complexe Dans la classe Complexe d crite en 2 1 1 nous d clarons la fonction membre publique suivante Complexe operator 11 que nous d finissons ensuite en utilisant le constructeur param tr de la classe Complexe Complexe operator Par la suite si z est une variable de type Complexe on pourra crire tout simplement l expression z pour d signer l oppos de z sachant que cette expression est quivalente l expression z operator message operator destin z return Complexe re im 2 4 3 Cas d un op rateur binaire Nous voulons surcharger l op rateur binaire pour qu il calcule la diff rence de deux nombres complexes Dans la m me classe Complexe nous d clarons la fonction membre publique suivante Complexe operator Complexe u que nous d finissons ensuite en utilisant galement le constructeur param tr de la classe Complexe Complexe operator Complexe u Par la suite si zi et z2 sont deux variables de type Complexe on pourra crire tout simplement l expression z1 z2 pour d signer le nombre complexe obtenu en soustrayant z2 de z1 sachant que cette expression est quivalente l expression z1 operator z2 message operator destin z1 ap pliqu avec le param tre d entr e z2 return
47. rarchie de classes suivante Acteur Meneur Joueur MeneurHumain MeneurOrdinateur JoueurHumain JoueurOrdinateur 3 4 2 Conform ment 1 4 2 nous crirons un fichier de d claration h et un fichier de d finition cpp pour chacune de ces sept classes Afin d viter que par le jeu des directives d inclusion include certains fichiers de d clarations ne soient inclus plusieurs fois ce qui provoquerait une erreur la compilation nous donnerons aux fichiers h la structure suivante ifndef SYMBOLE si SYMBOLE n est pas d fini define SYMBOLE d finir SYMBOLE ici les d clarations normalement pr vues endif fin du si ifndef est une directive de compilation conditionnelle elle signifie que les lignes qui suivent jusqu au endif ne doivent tre compil es que si SYMBOLE n est pas d j d fini Or en vertu de la deuxi me ligne ceci n arrive que lorsque le compilateur rencontre le fichier pour la premi re fois 3 4 3 D clarations des classes ifndef _ACTEURH define _ACTEURH class Acteur public void AfficheNom protected char nom 20 endif ifndef _MENEURH define _MENEURH include acteur h class Meneur public Acteur public virtual int Reponds int prop endif JI SSSR ASS ESA SeRSE Joueur h FERRER STE Een ifndef _JOUEURH define _JOUEURH include acteur h class Joueur public Acteur public virtual int Propose int
48. re la proposition du joueur avec le num ro secret et rend son diagnostic Propose de Joueur entr e le diagnostic du pr c dent essai sortie un nombre e compte tenu des tentatives pr c dentes met une nouvelle proposition 2 5 5 4 me tape description du traitement principal La fonction main sera le chef d orchestre de la simulation Son travail consiste e d clarer un joueur et un meneur o faire prendre la proposition du joueur la transmettre au meneur prendre le diagnostic du meneur le transmettre au joueur jusqu la fin de la partie e afficher le r sultat Remarquons que nos deux objets acteurs ne communiquent entre eux que de mani re indirecte par l interm diaire de la fonction main meneur JOUEUR NZ main On pourrait mettre directement en rapport les objets entre eux l aide de pointeurs paragraphe 6 2 5 6 5 tape d claration des classes Nous en arrivons la programmation proprement dite Nous commen ons par crire les fichiers de d clarations des classes Meneur et Joueur 14 dl MENQUT h E ce fichier contient la d claration de la classe Meneur class Meneur public Meneur initialise un meneur int Reponds int prop re oit la proposition du joueur renvoie 0 si c est exact 1 si c est plus et 2 si c est moins private int numsecret num ro secret choisi au d part
49. s A friend class B la classe B est d clar e amie de la classe A public private Remarque Il ne faut pas abuser de la relation d amiti car elle constitue une entorse au principe d encapsulation A 2 Patrons A 2 1 En C il est possible de d clarer des classes param tr es par des types gr ce au m canisme des patrons template Supposons par exemple que nous voulions crire une classe Tableau permettant de ranger aussi bien des entiers que des r els ou des cha nes de caract res Au lieu d crire autant de classes Tableau qu il y a de types ranger la solution consiste crire une unique classe Tableau param tr e par un type a priori inconnu qu on appelle T template lt class T gt signale que T est un type param tre de ce qui suit class Tableau public Tableau short dim Tableau T amp operator short index surcharge de l op rateur private short taille T xptab Voici la d finition de la classe Tableau template lt class T gt Tableau lt T gt Tableau short dim taille dim ptab new T taille F3 template lt class T gt Tableau lt T gt Tableau J delete ptab lib ration m moire pour un tableau dynamique template lt class T gt T amp Tableau lt T gt operator short index if index lt 0 index gt taille cout lt lt nindice hors du rang exit 1 interrompt 1 ex cuti
50. s envisagerons deux sc narios diff rents Dans le premier l utilisa teur du programme tiendra le r le du joueur tandis que l ordinateur tiendra le r le du meneur Dans le second ce sera le contraire l utilisateur tiendra le r le du meneur et l ordinateur celui du joueur Nous crirons donc deux versions des classes Meneur et Joueur 15 Premi re version meneur cpp ce fichier contient la d finition de la classe Meneur le r le du meneur est tenu par l ordinateur include include include include lt iostream h gt lt stdlib h gt lt time h gt meneur h pour les nombres al atoires Meneur Meneur srand unsigned time NULL numsecret int Meneur Reponds int prop initialisation du g n rateur al atoire 1 rand 100 choix du num ro secret prop proposition du joueur if prop lt numsecret cout lt lt nC est plus return 1 if prop gt numsecret cout lt lt nC est moins return 2 cout lt lt nC est exact return 0 joueur cpp ce fichier contient la d finition de la classe Joueur le r le du joueur est tenu par l utilisateur du programme include lt iostream h gt include joueur h Joueur Joueur cout lt lt int Joueur int p cout lt lt nBonjour Vous allez jouer le r le du joueur Propose int diag
51. s espaces et les marques de fin de ligne 4 2 4 Remarques 1 Pour cr er un fichier binaire il faut passer le mode ios binary en second param tre dans le constructeur ou dans la fonction open 2 On peut combiner plusieurs modes d ouverture avec l op rateur par exemple ios in ios out 4 3 Fonctions de contr le 4 3 1 Pour tout flot il est possible de contr ler le bon d roulement des op rations d entr e sortie gr ce aux fonctions suivantes e good vraie si tout va bien et qu en principe la prochaine op ration d entr e sortie devrait se d rouler normalement eeof vraie si la derni re op ration a fait atteindre la fin du fichier efail vraie s il y a chec apr s une op ration e bad vraie s il y a chec et si le fichier disque est endommag e clear permettant de r initialiser les bits d tat du flot 4 3 2 Exemple 1 La fonction get renvoie en principe une r f rence de stream voir 4 1 2 Toutefois dans le cas o une expression conditionnelle consiste en un appel une fonction de iostream et lorsque cette fonction a pour valeur une r f rence de stream le compilateur substitue cette valeur le r sultat de good Voici pourquoi la boucle de l exemple 4 2 3 fonctionne correctement 36 4 3 3 Exemple 2 saisie prot g e Voici un fragment de programme permettant de contr ler qu une donn e introduite au clavier est correcte include lt io
52. sp fonctions s appellent donn es membres resp fonctions membres ou encore m tho des de l objet L originalit dans la notion d objet c est que variables et fonctions sont regroup es dans une m me structure 1 2 4 Un ensemble d objets de m me type s appelle une classe Tout objet appartient une classe on dit aussi qu il est une instance de cette classe Par exemple si l on dispose de plusieurs chronom tres analogues celui d crit en 1 1 4 ces chronom tres appartiennent tous une m me classe chronom tre chacun est une instance de cette classe En d crivant la classe chronom tre on d crit la structure commune tous les objets appartenant cette classe 1 2 5 Pour utiliser les objets il faut d abord d crire les classes auxquelles ces objets appartiennent La description d une classe comporte deux parties une partie d claration fiche descriptive des donn es et fonctions membres des objets de cette classe qui servira d interface avec le monde ext rieur une partie impl mentation contenant la programmation des fonctions membres 1 3 Encapsulation 1 3 1 Dans la d claration d une classe il est possible de prot ger certaines donn es membres ou fonc tions membres en les rendant invisibles de l ext rieur c est ce qu on appelle l encapsulation A quoi cela sert il Supposons qu on veuille programmer une classe Cercle avec comme donn es membres
53. stream h gt short nombre cout lt lt Entrez un entier court cin gt gt nombre if cin good Se traitement normal else if cin fail10 ce n est pas une expression de type short cin clear on revient l tat normal Wray message d avertissement 4 4 Surcharge des op rateurs gt gt et lt lt Le programme suivant montre comment on peut surcharger les op rateurs d entr e sortie habituels gt gt et lt lt rendant ainsi possible la lecture ou l criture d un objet depuis ou vers n importe quel flot fichier ou organe logique include lt iostream h gt include lt fstream h gt include lt string h gt const short MAX 40 class Plat public void Setnom char name char Getnom void Setprix float montant float Getprix private float prix char nom MAX J void Plat Setnom char name d tails omis char Plat Getnom void Plat Setprix float montant float Plat Getprix istream amp operator gt gt istream amp is Plat amp article float montant char chaine MAX is getline chaine MAX mieux que is gt gt chaine article Setnom chaine is gt gt montant article Setprix montant is ignore 1 n return is pour pouvoir encha ner les entr es is gt gt a gt gt b ostream amp operator lt lt ostream amp os Plat amp article os lt lt article G
54. structeurs de Fils Pere et GrandPere 3 2 6 Cas des constructeurs param tr s Supposons d clar es les classes suivantes class Base Base short val class Derivee public Base Derivee float x f 21 Dans la d finition du constructeur de Derivee on pourra indiquer quelle valeur passer au constructeur de la classe Base de la mani re suivante rapprocher de 2 3 3 Derivee Derivee float x Base 20 3 2 7 Deuxi me exemple include lt iostream h gt class Rectangle public Rectangle short 1 short h void AfficheAire void protected short largeur hauteur Rectangle Rectangle short 1 short h largeur 1 hauteur h void Rectangle AfficheAire cout lt lt Aire lt lt largeur hauteur lt lt n class Carre public Rectangle public Carre short cote Carre Carre short cote Rectangle cote cote void main Carre monCarre Rectangle monRectangle monCarre new Carre 10 monCarre gt AfficheAire affiche 100 monRectangle new Rectangle 10 15 monRectangle gt AfficheAire affiche 150 Nous retiendrons ceci Gr ce l h ritage avec peu de lignes de code on peut cr er de nouvelles classes partir de classes existantes sans avoir modifier ni recompiler ces derni res Le g nie logiciel fait souvent usage de librairies toutes faites contenant des classes qu il suffit de d river pour
55. teur du menu principal b Cliquer l endroit du nouveau menu taper son intitul Triangles puis valider par entr e c Entrer de la m me mani re les intitul s des trois articles de ce menu Nombre Fond Go d Compiler et ex cuter A ce stade les commandes sont au menu mais d sactiv es tant que nous n avons pas programm pour chacune d elle le gestionnaire correspondant ces commandes ne font rien 43 5 3 2 Lancer le dessin a Dans la classe CTriangle View ajouter la donn e membre priv e m_ actif de type boolean pour cela on peut ajouter directement sa d claration dans le fichier TriangleView h ou alors dans l onglet ClassView cliquer avec le bouton droit de la souris sur le nom de la classe CTriangleView et utiliser le menu contextuel qui appara t b Dans le constructeur crire m_actif false c Dans OnDraw ajouter les instructions suivantes pour que le dessin ne se fasse que si m_actif est vrai if m actif mere instructions dessinant le triangle mactif false d Ajouter le gestionnaire correspondant l article de menu Go Pour cela activer ClassWizard lt CTRL gt W onglet Message Maps et s lectionner en haut le nom de la classe destinataire CTriangleView gauche l ID de la commande de menu ici ID_TRIANGLES_GO droite le type de message COMMAND puis demander Add Function accepter le nom propos par l assistant et demander Edit Co
56. tion correspondante case A p PrendsPiece 1 break case B p PrendsPiece 2 break case C p PrendsPiece 5 break case D p PrendsPiece 10 1 5 2 Op rateurs et Dans une expression on acc de aux donn es et fonctions membres d un objet gr ce la notation point e si mon objet est une instance de Ma_classe on crit mon_objet donnee condition que donnee figure dans la d claration D autre part dans la d finition d une fonction membre on doit ajouter lt nom de la classe gt le nom de la fonction Par exemple la d finition d une fonction membre truc 0 de la classe Ma_classe de Ma_classe et que l acc s en soit possible voir 1 3 aura la forme suivante lt type gt Ma classe lt instruction bloc gt truc lt d claration de param tres formels gt L appel se fait avec la notation point e par exemple mon obj truc en programmation objet on dit parfois qu on envoie le message truc l objet destinataire mon_ob Exceptions certaines fonctions membres sont d clar es sans type de r sultat et ont le m me nom que celui de la classe ce sont les constructeurs Ces constructeurs permettent notamment d initialiser les objets d s leur d claration 1 5 3 R alisation pratique du programme Elle se fait en trois tapes 1 cr ation des fichiers sources parcmetr h parcmetr cpp et simul cpp 2 compilation des fichiers cpp savoir parcme
57. tr cppet simul cpp ce qui cr e deux fichiers objets parcmetr obj et simul obj ces fichiers sont la traduction en langage machine des fichiers cpp correspondants 3 dition des liens entre les fichiers objets pour produire finalement un fichier ex cutable dont le nom se termine par exe Dans l environnement Visual C de Microsoft les phases 2 et 3 sont automatis es il suffit de cr er les fichiers sources h et cpp d ajouter ces fichiers dans le projet et de lancer ensuite la commande build Remarque On peut ajouter directement dans un projet un fichier obj il n est pas n cessaire de disposer du fichier source cpp correspondant On pourra donc travailler avec des classes d j compil es Chapitre 2 PROGRAMMATION DES CLASSES 2 1 Un exemple 2 1 1 Voici la d claration et la d finition d une classe Complexe d crivant les nombres complexes et un programme qui en montre l utilisation dl complexe h d claration de la classe Complexe class Complexe public Complexe float x float y Complexe void Lis void Affiche Complexe operator Complexe g private float re im premier constructeur de la classe fixe la partie r elle x la partie imaginaire y second constructeur de la classe initialise un nombre complexe 0 lit un nombre complexe entr au clavier affiche un nombre complexe surcharge de l op rateur d addition
58. tre utilis s normale ment en toute s curit 1 4 Strat gie D D U 1 4 1 En C la programmation d une classe se fait en trois phases d claration d finition utilisation en abr g D D U D claration c est la partie interface de la classe Elle se fait dans un fichier dont le nom se termine par h Ce fichier se pr sente de la fa on suivante class Maclasse public d clarations des donn es et fonctions membres publiques private d clarations des donn es et fonctions membres priv es D finition c est la partie impl mentation de la classe Elle se fait dans un fichier dont le nom se termine par cpp Ce fichier contient les d finitions des fonctions membres de la classe c est dire le code complet de chaque fonction Utilisation elle se fait dans un fichier dont le nom se termine par cpp 1 4 2 Structure d un programme en C Nos programmes seront g n ralement compos s d un nombre impair de fichiers pour chaque classe un fichier h contenant sa d claration un fichier cpp contenant sa d finition un fichier cpp contenant le traitement principal Ce dernier fichier contient la fonction main et c est par cette fonction que commence l ex cution du programme Sch matiquement CLASS1 H CLASS2 H lt d claration CLASS1 CPP CLASS2 CPP include CLASS1 H include CLASS2 H MAIN CPP lt dcfinition lt
59. urn vide int Boite Pleine F return pleine class Pile public Pile int n 10 void Mets Objet po Objet Extrais protected public Boite int nbelements dl d finition de la Pile Pile int n Boite n nbelements 0 void Pile Mets Objet po T nbelements po 0 pleine vide nbelements taille Objet Pile Extrais Objet temp temp T nbelements pleine 0 vide nbelements 0 return temp class Queue public Queue int n 10 void Mets Dbjet po Objet Extrais protected public Boite int tete queue Queue Queue int n Boite n J tete queue 0 void Queue Mets Objet po T queue po queue taille 0 pleine tete queue vide Objet Queue Extrais Objet temp d finition de la classe d crivant une pile construit une pile contenant au maximum n pointeurs met dans la pile le pointeur po extrait un pointeur de la pile nombre effectif d l ments contenus dans la pile classe Pile classe d crivant une queue construit une queue contenant au maximum n pointeurs met dans la queue le pointeur po extrait un pointeur de la queue indice o se trouve l l ment le plus ancien indice o se mettra le prochain l ment T est utilis comme un tableau circulaire classe Queue retour au d
60. utes 0 void Parcmetre Affiche affichage du temps de stationnement restant et du mode d emploi du parcm tre cout lt lt n n tTEMPS DE STATIONNEMENT cout lt lt heures lt lt heures lt lt minutes lt lt minutes cout lt lt n n nMode d emploi du parcm tre cout lt lt n tPour mettre une pi ce de 10 centimes tapez A cout lt lt n tPour mettre une pi ce de 20 centimes tapez B cout lt lt n tPour mettre une pi ce de 50 centimes tapez C cout lt lt n tPour mettre une pi ce de 1 euro tapez D cout lt lt n tPour quitter le programme tapez Q void Parcmetre PrendsPiece float valeur introduction d une pi ce minutes valeur 10 1 euro 50 minutes de stationnement while minutes gt 60 heures 1 minutes 60 if heures gt 3 on ne peut d passer 3 heures heures 3 minutes 0 PR ES BE SERRES SEE simul OR FESSES Reese ce fichier contient l utilisation de la classe Parcmetre include lt iostream h gt include parcmetr h pour les entr es sorties pour la d claration de la classe Parcmetre void main traitement principal Parcmetre p d claration d un parcm tre p char choix X while choix Q boucle principale d v nements p Affiche cout lt lt nchoix gt cin gt gt choix lecture d une lettre switch choix ac
61. ymorphisme nous serons en mesure d crire une version unique et beaucoup plus souple de ce programme o la distribution des r les pourra tre d cid e au moment de l ex cution 2 6 Pointeurs et objets 2 6 1 On peut naturellement utiliser des pointeurs sur des types classes Nous pourrons ainsi utiliser des objets dynamiques par exemple de la classe Complexe cf 2 1 1 en crivant Complexe pc new Complexe etc De la m me mani re qu avec les objets statiques si new est utilis avec un type classe le constructeur par d faut s il existe est appel automa tiquement il est possible de faire un appel explicite un constructeur par exemple Complexe pc new Complexe 1 0 2 0 2 6 2 L acc s aux donn es et fonctions membres d un objet point peut se faire gr ce l op rateur fl che gt Par exemple avec les d clarations pr c dentes on crira pc gt re plut t que xpc re pc gt Affiche plut t que xpc Affiche 2 6 3 Liens entre objets Supposons d clar es deux classes avec class A public machin truc fonction membre 17 class B private A pa donn e membre pointeur sur un objet de la classe A Comme un objet obj B de la classe B contient un pointeur sur un objet de la classe A cela permet obj B de communiquer directement avec cet objet en lui envoyant par exemple le message pa gt truc Ainsi En programmati

Download Pdf Manuals

image

Related Search

Related Contents

Cautions Options Fingerprints Registration List  C1_German manual.book  Manual Diapulsi 990  Parkside A1 User's Manual  取扱説明書  

Copyright © All rights reserved.
Failed to retrieve file