Introduction à la programmation orientée objet en C ?· Introduction à la programmation orientée…

  • Published on
    13-Sep-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Introduction la programmation oriente objet en C</p><p>par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>Date de publication : 2003</p><p>Dernire mise jour :</p><p>Ce document prsente brivement les mcanismes du langage C qui sont sollicits pourparvenir la Programmation Oriente Objet (POO).Il constitue donc une introduction la Programmation Oriente Objet en C.</p><p>Votre avis et vos suggestions sur cet articlenous intressent !Alors aprs votre lecture, n'hsitez pas :</p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.html</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 2 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>I - Les mcanismes du langage C utiliss..................................................................................................................3I-A - Les pointeurs..................................................................................................................................................3I-B - Les flches..................................................................................................................................................... 3I-C - Les pointeurs de fonctions............................................................................................................................ 3I-D - Un cast (changement de type)...................................................................................................................... 4I-E - Le cast (changement de type) des pointeurs................................................................................................ 4I-F - Les types numrs.......................................................................................................................................4I-G - Les types structurs...................................................................................................................................... 5</p><p>II - L'utilisation des mcanismes pour la Programmation Oriente Objet...................................................................6II-A - Modlisation d'une classe.............................................................................................................................6II-B - Les constructeurs..........................................................................................................................................6II-C - Le this........................................................................................................................................................... 6II-D - Le destructeur............................................................................................................................................... 6II-E - Les mthodes................................................................................................................................................7II-F - Conseils et avantages...................................................................................................................................7II-G - Exemple complet.......................................................................................................................................... 7</p><p>II-G-1 - La classe Stylo.....................................................................................................................................7II-G-2 - Dfinition du type en C dans le header (stylo.h)................................................................................. 7II-G-3 - Dfinition de la classe en C dans le fichier source C (stylo.c)............................................................ 8II-G-4 - Utilisation dans un programme............................................................................................................ 9</p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.htmlhttp://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 3 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>I - Les mcanismes du langage C utiliss</p><p>Les pointeurs ont une rputation de mal-aim. Ds qu'on en parle, on pense :</p><p> complexits difficults rsoudre les bugs dbordement de mmoire (coredump)</p><p>Or, ce n'est ni plus ni moins qu'une adresse mmoire. Vous dplacez simplement votre rfrentiel de la variable son adresse (un peu comme si vous ne vous adressez pas un interlocuteur par nom mais par son lieu d'habitation).Dans notre cas, les pointeurs doivent devenir vos allis et vous devez apprendre les matriser. L'autre objectif de cedocument est de montrer comment avec quelques rgles simples, il est possible de devenir copain-copain avec eux.</p><p>I-A - Les pointeurs</p><p>Un pointeur est une adresse mmoire (on parle aussi de rfrence). Il est trs frquemment utilis avec des allocationsdynamiques (malloc, free ou realloc). Lors de la dclaration d'une variable, nous la matrialisons par une toile. (ex :int i; i contient un entier et int *i; contient une rfrence (une adresse) sur une variable contenant un entier).Il est utilis dans le passage de paramtres par adresse (la valeur du paramtre est susceptible d'voluer).Exemple :</p><p>int *Ptr; /* Ptr est un pointeur sur un entier */ </p><p>t_Cellule *Courant; /* Courant est un pointeur sur un objet de type t_Cellule */</p><p>char *Car; /* Car est un pointeur sur un caractre ou un pointeur sur le premier caractre d'une chane de caractres. */ </p><p>t_Individu **Individu; /* Ceci est un pointeur sur un pointeur de type t_Individu */ </p><p>Dans le dernier exemple, cela revient dcrire un individu non pas par son nom, ni par son adresse mais par saville. Ceci est utilis quand l'individu doit changer d'adresse.</p><p>I-B - Les flches</p><p>Les flches constituent un raccourci dans l'utilisation du pointeur.Courant-&gt;Suivant est quivalent (*Courant).Suivant. Le parenthsage est trs important, il indique l'ordre danslequel il faut lire.Remarques :</p><p> (*Courant).Suivant : on accde la proprit suivant de l'objet l'adresse Courant *Courant.Suivant : on accde l'objet adress par l'information Courant.Suivant </p><p>I-C - Les pointeurs de fonctions</p><p>En C, il n'existe pas de procdures au sens strict du terme. Nous assimilons une procdure une fonction qui retourneun objet non dfini (void).Les fonctions, qui ne sont pas seulement du code, sont aussi des adresses statiques (en interne). Elles indiquentl'adresse dans le segment de code du dbut de son corps. Pour disposer de fonctions dynamiques (comme unefonction variable), il existe un dispositif qui est le pointeur de fonction :</p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.htmlhttp://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 4 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>void (*Ecrire)(void) : Ecrire est un pointeur sur une fonction qui n'accepte aucun paramtre et qui ne retourne rien.Ecrire est donc une variable contenant l'adresse d'une fonction.L'affectation de cette variable se fait comme sur l'exemple ci-dessous :</p><p>void Ecrire_fonction(void) { printf("Bonjour") ; return ;}</p><p>void Traitement(void){</p><p> /* ... */ Ecrire = Ecrire_fonction; /* ou */ Ecrire = (void (*)(void))Ecrire_fonction; /* caste Ecrire_fonction en un pointeur sur une fonction ne prenant pas de paramtres et ne retournant rien */ /* ... */ } </p><p>L'utilisation de la variable s'utilise comme une fonction normale :</p><p>Ecrire(); </p><p>I-D - Un cast (changement de type)</p><p>C'est un mcanisme qui permet de convertir de manire explicite le type d'une valeur en un autre type.Exemple :</p><p>int i ;float f=10.546 ;</p><p>i=(int)f ; /* converti le rel f en entier */ </p><p>I-E - Le cast (changement de type) des pointeurs</p><p>Le cast de pointeurs permet de modifier le type de l'objet rfrenc par une adresse.Exemple :</p><p>t_Individu *Individu ;t_Fonctionnaire *Fonctionnaire ;</p><p>Individu=(t_Individu *)Fonctionnaire ; /* un fonctionnaire est un individu */</p><p>I-F - Les types numrs</p><p>Cela permet (au contrainte de #define) de dfinir des constantes et de les regrouper sous un mme type.Exemple :</p><p>typedef enum { VRAI=1, FAUX=0, TRUE=1, FALSE=0} e_Booleen ; </p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.htmlhttp://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 5 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>I-G - Les types structurs</p><p>Un type structur permet de regrouper au sein d'une mme entit un ensemble de proprits cohrentes (ex : nom,prnom, civilit pour un individu). Ils sont utiliss aussi pour la construction de listes chanes, d'arbres, ...</p><p>typedef struct { e_Civilite Civilite; char Nom[40]; char Prnom[40];</p><p>} t_Individu ; </p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.htmlhttp://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 6 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>II - L'utilisation des mcanismes pour la Programmation Oriente Objet</p><p>II-A - Modlisation d'une classe</p><p>Pour faire simple, une classe est un type structur comprenant des proprits de type pointeur de fonction etd'autres types plus classiques . Il est ncessaire de ranger les proprits selon l'ordre suivant :</p><p> Le destructeur (pointeur de fonction) Les mthodes publiques (pointeurs de fonction) Les mthodes protges (pointeurs de fonction) Les mthodes prives (pointeurs de fonction) Les attributs (autres types)</p><p>Pour complter le dispositif, il faut disposer de fonctions qui permettent d'initialiser cette structure et d'associerles pointeurs de fonction (adresse de fonction dynamique) avec les fonctions implmentes (adresse de fonctionstatique) : les constructeurs.</p><p>II-B - Les constructeurs</p><p>Ces fonctions devront :</p><p> Allouer une zone mmoire suffisante pour stocker la structure matrialisant la classe Affecter les mthodes et le destructeur Initialiser les attributs Retourner une rfrence sur une nouvelle instance de la classe</p><p>De manire pratique, je les nomme comme suit : Instancier__ ;Exemple :</p><p>t_Stylo *Instancier_stylo_rouge() ; t_Stylo *Instancier_stylo_copie(t_Stylo *) ; </p><p>II-C - Le this</p><p>En C++ ou en Java, l'objet this est la rfrence de l'instance d'une classe utilisant une mthode. Il est souventutilis de manire implicite. Cette information, en C, est rfrence par le premier argument des mthodes (pointeursur la structure laquelle appartient la mthode) et doit tre utilise de manire explicite.Exemple :</p><p>e_Couleur Lire_couleur_stylo(t_Stylo *this) ; void Ecrire_couleur_stylo(t_Stylo *this,e_Couleur Couleur) ; </p><p>II-D - Le destructeur</p><p>C'est une fonction qui permet de librer la zone mmoire alloue par les constructeurs. Sa particularit est de devoirpositionner la rfrence de l'instance NULL aprs sa destruction. C'est pour cette raison qu'il est ncessaire depasser la rfrence de la rfrence d'une instance.Exemple :</p><p>void Liberer_stylo(t_Stylo **this) ; </p><p>http://www.developpez.comhttp://pagesperso-orange.fr/aymeric.lesert/principal.html?http://pagesperso-orange.fr/aymeric.lesert/accueil.htmlhttp://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p></li><li><p>Introduction la programmation oriente objet en C par Aymeric Lesert (Site personnel de Aymeric Lesert)</p><p>- 7 -Copyright 2003 - Aymeric Lesert. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.</p><p>http://c.developpez.com/cours/introduction-programmation-orientee-objet-c/</p><p>II-E - Les mthodes</p><p>Dans notre modle, il est trs compliqu de mettre en uvre une sparation entre les mthodes prives, protges etpubliques. J'ai donc fait des choix de simplification. La classe des mthodes est matrialise par des commentaires(Cf. Exemple ci-dessous).L'implmentation des mthodes s'effectue dans des fonctions statiques.Exemple :</p><p>e_Couleur Lire_couleur_stylo(t_Stylo *this){ return(this-&gt;Couleur) ;}</p><p>void Ecrire_couleur_stylo(t_Stylo *this,e_Couleur Couleur) { this-&gt;Couleur = Couleur; return ;} </p><p>t_Stylo Instancier_stylo(){</p><p> /* ... */</p><p> this-&gt;Lire_couleur = Lire_couleur_stylo ; this-&gt;Ecrire_couleur = Ecrire_couleur_stylo ;</p><p> /* ... */</p><p>}</p><p>II-F - Conseils et avantages</p><p>Je vous conseille vivement de dcrire 2 fichiers par classe ou par ensemble de classes :</p><p> Un fichier header (exemple : stylo.h) : contenant la structure matrialisant la classe et dfinissant le prototypedu(des) constructeur(s)</p><p> Un fichier source (exemple : stylo.c) : contenant l'implmentation des mthodes et des constructeurs</p><p>Dans votre fichier source, toutes les implmentations de vos fonctions peuvent commencer par le mot cl static .Cela permet de masquer (et d'interdire) l'accs ces fonctions sans passer par la c...</p></li></ul>

Recommended

View more >