Académique Documents
Professionnel Documents
Culture Documents
Langage C++/Classe
< Langage C++
La classe
En programmation orientée objet, tout est basé sur le concept de
la classe. La classe est une entité autonome capable de maintenir,
une fois instanciée (définie), la cohérence des données qu'elle est
chargée d'entretenir. (nous mettrons en évidence la syntaxe dans
la partie implémentation)
La théorie veux que tout attribut qui aurait besoin d’être transmis
ou modifié, le soit par l'une de ces méthodes d'accès. (Je n'ai
jamais eu à faire autrement.) Les méthodes définissent aussi
l'interface d'une classe.
Généralisation de classes
Carré
Rectangle
Parallélogramme
Losange
Quadrilatère
Cercle
Ovale
Dans les figures imposées on peut voir que "Carré" est un cas
particulier de (ou "une sorte de") "Rectangle" qui est lui-même un
cas particulier du "Parallélogramme" qui est lui-même un
"Quadrilatère". Quant à "Losange" c’est un "Quadrilatère".
Abstraction de classes
Tout d’abord il faut savoir qu'en C++ une classe dérivée reçoit
toujours une copie de l'intégralité des attributs et des méthodes
de sa classe ancêtre. En C++, bien que l’on puisse choisir la façon
dont sont copiés les membres de la classe ancêtre, la théorie-
objet veux que l’on hérite toujours des classes ancêtres de
manière publique afin que tous les membres publics de la classe
ancêtre soient aussi disponibles de manière publique dans la
classe dérivée. L'héritage permet de ne pas réécrire éternellement
les mêmes codes, de réutiliser les objets, de pouvoir les
spécialiser et mettre en œuvre le polymorphisme de classe.
Polymorphisme de classes
Le polymorphisme en informatique se traduit par la capacité qu'a
un pointeur de classe ancêtre présentant une interface donnée, à
appeler la méthode de l'instance de la classe dérivée
correspondant à la méthode de la classe ancêtre. En C++ la mise
en œuvre du polymorphisme se fait à l'aide du mot clé "virtual".
Dans la pratique et pour reprendre l'exemple vu précédemment :
Si l’on créé un pointeur sur Figure que l’on lui assigne l'adresse de
l'instance d'un carré et que l’on demande au pointeur-figure de se
dessiner alors le pointeur va appeler la méthode virtuelle et par le
biais de l'héritage virtuel appeler la méthode implémentée dans la
classe Carré.
Implémentation
Définition
Syntaxe:
class <NomNouvelleClasse> :
[public: <ClasseAncêtre>[,
<AutreClasseAncêtre>][, ...]]
{
[ [<Visibilitée>:]
<TypeAttribut1>
<NomAttribut1>;]
[<Visibilitée>:]
<TypeAttributN>
<NomAttributN>;] ]
[<Visibilitée>:]
<TypeMethode1> <NomMethode1>
(<TypeParamettre>
<NomParamettre>[ =
<ValeurParDefaut>][, ...]);
[ [<Visibilitée>:]
<TypeMethodeN> <NomMethodeN>
(<TypeParamettre>
<NomParamettre>[ =
<ValeurParDefaut>][, ...]); ]
};
Définition
Syntaxe:
<TypeRetour> [<NomClasse>::]<NomMethode>
([<TypeParametre> <NomParametre>[,<...>]])
{
[<Instructions>;]
}
dans le ".h"
#ifndef FAINEANTE_H
#define FAINEANTE_H
class Faineante;
{
public:
// Constructeur par
défaut
Faineante();
// Constructeur par
copie
Faineante(Faineante&
pCopie);
// Destructeur
virtual ~Faineante();
// "virtual" active le
polymorphisme
};
#endif //FAINEANTE_H
Dans le ".cpp"
Faineante::Faineante()
{
}
Faineante::Faineante(Faineante&
pCopie)
{
}
Faineante::~Faineante()
{
}
Exemples:
Exemple
dans "Carre.h"
#ifndef Carre_H
#define Carre_H
#include "Rectangle.h"
// Un carré est un rectangle dont toutes les
arrêtes sont égales.
class Carre : public Rectangle
{
public:
// Constructeur paramétré
Carre(double pArrete);
// Destructeur
virtual ~Carre();
virtual void mDessine();
};
dans "Carre.cpp"
#include "Carre.h"
// Constructeur paramétré
// Appelle le constructeur de la classe ancêtre
en le paramétrant correctement
Carre::Carre(double pArrete):Rectangle(pArrete,
pArrete)
{
}
// Destructeur
Carre::~Carre()
{
}
void Carre::mDessine()
{
//Dessine ici le Carre (vrais code de dessin
non pertinent car trop volumineux pour le gain
obtenu sur l’intérêt de la leçon).
cout << "Dessine Carre :\n" << endl;
Rectangle::mDessine();
}
dans "Rectangle.h"
#ifndef Rectangle_H
#define Rectangle_H
#include "Parallelogramme.h"
dans "Rectangle.cpp"
#include "Rectangle.h"
// Destructeur
Rectangle::~Rectangle()
{
}
void Rectangle::mDessine()
{
//Dessine ici le Rectangle (vrais code de
dessin non pertinent car trop volumineux pour le
gain obtenu sur l’intérêt de la leçon).
cout << "Dessine Rectangle :\n" << endl;
Parallelogramme::mDessine();
}
dans "Parallelogramme.h"
#ifndef Parallelogramme_H
#define Parallelogramme_H
#include "Quadrilatere.h"
protected:
virtual void mAngleA(double& pAngle);
virtual void mAngleB(double& pAngle);
virtual void mAngleC(double& pAngle);
virtual void mAngleD(double& pAngle);
public:
// Constructeur parametré
Parallelogramme(double pArreteAB, double
pArreteBC, double pAngleA);
// Destructeur
virtual ~Parallelogramme();
// Méthode de dessin des
parallélogrammes.
virtual void mDessine();
};
dans "Parallelogramme.cpp"
#include <iostream>
#include "Parallelogramme.h"
// Constructeur paramétré
Parallelogramme::Parallelogramme(double
pArreteAB, double pArreteBC, double
pAngleA):Quadrilatère(pArreteAB, pArreteBC,
pArreteAB, pArreteBC, 0.0, 0.0, 0.0, 0.0)
{
// Dans un Parallélogramme les arrêtes :
// AB = CD et BC = AD.
// Les angles :
// A = C, B = D et A + B + C + D = 360°.
// Ici nous passons par les méthodes de
Parallélogramme pour garantir que les angles
seront inférieur ou égal à 180.
// Destructeur
virtual Parallelogramme::~Parallelogramme()
{
}
// Méthode de dessin des parallélogrammes.
virtual void Parallelogramme::mDessine()
{
//Dessine ici le Parallelogramme (vrais code
de dessin non pertinent car trop volumineux pour
le gain obtenu sur l’intérêt de la leçon).
cout << "Dessine Parallelogramme :\n" <<
endl;
Quadrilatere::mDessine();
}
dans "Losange.h"
#ifndef Losange_H
#define Losange_H
#include "Quadrilatere.h"
protected:
virtual void mAngleA(double& pAngle);
virtual void mAngleB(double& pAngle);
virtual void mAngleC(double& pAngle);
virtual void mAngleD(double& pAngle);
public:
Losange(double pArreteAB, double
pArreteBC, double pAngleA);
virtual ~Losange();
virtual void mDessine();
};
dans "Losange.cpp"
#include "Losange.h"
Quadrilatere::mAngleA(mCorrectionAngle(pAngle))
}
Quadrilatere::mAngleB(mCorrectionAngle(pAngle))
}
Quadrilatere::mAngleC(mCorrectionAngle(pAngle))
}
void Losange::mAngleD(double& pAngle)
{
// Mettre à jour l'angle.
Quadrilatere::mAngleD(mCorrectionAngle(pAngle))
}
~Losange::Losange()
{
}
void Losange::mDessine()
{
//Dessine ici le Losange (vrais code de
dessin non pertinent car trop volumineux pour le
gain obtenu sur l’intérêt de la leçon).
cout << "Dessine Losange :\n" << endl;
Quadrilatere::mDessine();
}
dans "Quadrilatere.h"
#ifndef Quadrilatere_H
#define Quadrilatere_H
#include "Figure.h"
protected:
void mArreteAB(double& pArrete);
void mArreteBC(double& pArrete);
void mArreteCD(double& pArrete);
void mArreteDA(double& pArrete);
public:
Quadrilatere(double& pArreteAB, double&
pArreteBC, double& pArreteCD, double& pArreteDA
double& pAngleA, double& pAngleB, double&
pAngleC, double& pAngleD);
virtual ~Quadrilatere();
virtual void mDessine();
double mArreteAB();
double mArreteBC();
double mArreteCD();
double mArreteDA();
double mAngleA();
double mAngleB();
double mAngleC();
double mAngleD();
};
dans "Quadrilatere.cpp"
#include <math.h>
#include "Quadrilatere.h"
Quadrilatere::Quadrilatere(double& pArreteAB,
double& pArreteBC, double& pArreteCD, double&
pArreteDA, double& pAngleA, double& pAngleB,
double& pAngleC, double& pAngleD)
{
// Assure l'intégrité de la classe;
this->mArreteAB(pArreteAB);
this->mArreteBC(pArreteBC);
this->mArreteCD(pArreteCD);
this->mArreteDA(pArreteAD);
this->mAngleA(pAngleA);
this->mAngleB(pAngleB);
this->mAngleC(pAngleC);
this->mAngleD(pAngleD);
}
Quadrilatere::~Quadrilatere()
{
// rien à détruire.
}
void Quadrilatere::mDessine()
{
//Dessine ici le parallélogramme (vrais code
de dessin non pertinent car trop volumineux pour
le gain obtenu sur l’intérêt de la leçon).
cout << "Dessine Quadrilatere :\n" <<
"\tAB = " << this->mArreteAB() <<
",\n" <<
"\tBC = " << this->mArreteBC() <<
",\n" <<
"\tCD = " << this->mArreteCD() <<
",\n" <<
"\tDA = " << this->mArreteDA() <<
",\n" <<
"\tAngle A = " << this->mAngleA() <<
",\n" <<
"\tAngle B = " << this->mAngleB() <<
",\n" <<
"\tAngle C = " << this->mAngleC() <<
",\n" <<
"\tAngle D = " << this->mAngleD() <<
endl;
}
double Quadrilatere::mArreteAB()
{
return this->aArreteAB;
}
double Quadrilatere::mArreteBC()
{
return this->aArreteBC;
}
double Quadrilatere::mArreteCD()
{
return this->aArreteCD;
}
double Quadrilatere::mArreteDA()
{
return this->aArreteDAB;
}
double Quadrilatere::mAngleA()
{
return this->aAngleA;
}
double Quadrilatere::mAngleB()
{
return this->aAngleB;
}
double Quadrilatere::mAngleC()
{
return this->aAngleC;
}
double Quadrilatere::mAngleD()
{
return this->aAngleD;
}
dans "Figure.h"
#ifndef Figure_H
#define Figure_H
class Figure
{
public:
Figure();
virtual ~Figure();
virtual void mDessine() = 0; // "virtual
void mDessine() = 0;" est une méthode dite
"virtuelle pure" (à cause du "= 0").
// Elle n'a
pas de corps et rend donc de fait la classe
"Figure" abstraite. Cela signifie
// que l’on
ne peux pas instancier cette classe directement
Pour pouvoir instancier cette
// classe
il faut la dériver et implémenter la méthode
(lui donner un corps).
};
dans "Figure.cpp"
#include "Figure.h"
Figure::Figure()
{
}
Figure::~Figure()
{
}
Wikiversité