Commençons par la question qui doit vous brûler les lèvres.
Je croyais qu'on allait apprendre à créer des objets, pourquoi tu nous parles de créer une classe maintenant ?
Quel est le rapport ?
Eh bien justement, pour créer un objet, il faut d'abord créer une classe !
Je m'explique : pour construire une maison, vous avez besoin d'un plan d'architecte non ? Eh bien imaginez simplement que la classe c'est le plan, et que l'objet c'est la maison.
"Créer une classe", c'est donc dessiner les plans de l'objet.
Une fois que vous avez les plans, vous pouvez faire autant de maisons que vous voulez en vous basant sur les plans. Pour les objets c'est pareil : une fois que vous avez fait la classe (le plan), vous pourrez créer autant d'objets du même type que vous voulez.
Créer une classe, oui mais laquelle ?
Avant tout, il va falloir choisir la classe sur laquelle nous allons travailler.
Pour reprendre mon exemple sur l'architecture : allons-nous créer un appartement, une villa avec piscine, un spacieux loft ?
En clair, quel type d'objet voulons-nous être capable de créer ?
Les choix ne manquent pas. Je sais que, quand on débute, on a du mal à imaginer ce qui peut être considéré comme un objet. La réponse est : presque tout !
Vous allez voir, vous allez petit à petit avoir le feeling qu'il faut avec la POO. Puisque vous débutez, c'est moi qui vais choisir (vous avez pas trop le choix de toute façon

).
Pour notre exemple, nous allons créer une classe
Personnage qui va permettre de représenter un personnage de jeu de rôle (RPG).
Bon, on la crée cette classe ?
C'est parti.
Pour commencer, je vous rappelle qu'une classe est constituée :
- De variables, ici appelées attributs (on parle aussi de variables membres)
- De fonctions, ici appelées méthodes (on parle aussi de fonctions membres)
(n'oubliez pas ce vocabulaire, il est fon-da-men-tal !)
Voici le code minimal pour créer une classe :
Code : C++ | class Personnage
{
}; // N'oubliez pas le point-virgule à la fin !
|
On utilise comme vous le voyez le mot-clé
class.
Il est suivi du nom de la classe que l'on veut créer. Ici, c'est Personnage.
Souvenez-vous de cette règle très importante : il faut que le nom de vos classes commence toujours par une lettre majuscule ! Bien que ce ne soit pas obligatoire (le compilateur ne hurlera pas si vous commencez par une minuscule), cela vous sera très utile par la suite pour différencier les noms des classes des noms des objets.
Nous allons écrire toute la définition de la classe entre les accolades. Tout ou presque se passera donc à l'intérieur de ces accolades.
Et surtout, super important, le truc qu'on oublie au moins une fois dans sa vie :
il y a un point-virgule après l'accolade fermante.
Ajout de méthodes et d'attributs
Bon c'est bien beau, mais notre classe Personnage est plutôt... vide.
Que va-t-on mettre dans la classe ? Vous le savez déjà voyons.
- Des attributs, c'est le nom que l'on donne aux variables contenues dans des classes.
- Des méthodes, c'est le nom que l'on donne aux fonctions contenues dans des classes.
Le but du jeu maintenant, c'est justement d'arriver à faire la liste de tout ce qu'on veut mettre dans notre Personnage. De quels attributs et de quelles méthodes a-t-il besoin ? Ca, c'est justement l'étape de
réflexion, la plus importante. C'est pour ça que je vous ai dit au début de ce chapitre qu'il ne fallait surtout pas coder comme des barbares dès le début, mais prendre le temps de
réfléchir.
Cette étape de réflexion avant le codage est essentielle quand on fait de la POO. Beaucoup de gens, dont moi, ont l'habitude de sortir une feuille de papier et un crayon pour arriver à établir la liste des attributs et méthodes dont ils vont avoir besoin.
Un langage spécial appelé UML a d'ailleurs été spécialement conçu pour "dessiner" les classes avant de commencer à les coder.
Par quoi commencer : les attributs ou les méthodes ? Il n'y a pas d'ordre en fait, mais je trouve un peu plus logique de commencer par voir les attributs
puis les méthodes.
Les attributs
C'est ce qui va caractériser votre classe, ici le personnage. Ce sont des variables, elles peuvent donc évoluer au fil du temps. Mais qu'est-ce qui caractérise un personnage de jeu de rôle ? Allons, un petit effort.
- Par exemple, tout personnage a un niveau de vie. Hop, ça fait un premier attribut : vie ! On dira que ce sera un int, et qu'il sera compris entre 0 et 100 (0 = mort, 100 = toute la vie).
- Dans un jeu de rôle (RPG), il y a le niveau de magie, aussi appelé mana. Là encore, on va dire que c'est un int compris entre 0 et 100. Si le personnage a 0 de mana, il ne peut plus lancer de sorts magiques et doit attendre que sa mana se recharge toute seule au fil du temps (ou boire une potion de mana !).
- On pourrait rajouter aussi le nom de l'arme que porte le joueur : nomArme. On va utiliser un string pour stocker le nom de l'arme.
- Enfin, il me semble indispensable d'ajouter un attribut degatsArme, un int toujours, qui indiquerait cette fois le nombre de dégâts que fait notre arme à chaque coup.
On peut donc déjà commencer à compléter notre classe avec ces premiers attributs :
Code : C++ | class Personnage
{
int m_vie;
int m_mana;
string m_nomArme;
int m_degatsArme;
};
|
Deux ou trois petites choses à savoir sur ce code :
- Ce n'est pas une obligation, mais une grande partie des programmeurs (dont moi) a l'habitude de faire commencer tous les noms des attributs de classe par m_ (le "m" signifiant "membre", pour indiquer que c'est une variable membre, c'est-à-dire un attribut). Cela permet de bien différencier les attributs des variables "classiques" (contenues dans des fonctions par exemple).
- Il est impossible d'initialiser les attributs ici. Cela doit être fait via ce qu'on appelle un constructeur, comme on le verra un peu plus loin.
- Comme on utilise un objet string, il faut bien penser à rajouter un #include <string> dans votre fichier puisque nous utilisons des chaînes de caractères.
La chose essentielle à retenir ici, est que l'on utilise des attributs pour représenter la notion d'
appartenance. On dit qu'un Personnage A UNE vie et A UN niveau de magie. Il POSSÈDE également une arme. Lorsque vous repérez une relation d'appartenance, il y a de fortes chances qu'un attribut soit la bonne solution à adopter.
Les méthodes
Les méthodes, elles, sont grosso modo les actions que le personnage peut faire ou qu'on peut lui faire faire. Les méthodes lisent et modifient les attributs.
Voici quelques actions qu'on peut faire avec notre personnage :
- recevoirDegats : le personnage prend un certain nombre de dégâts, donc perd de la vie.
- attaquer : le personnage attaque un autre personnage avec son arme. Il fait autant de dégâts que son arme lui permet d'en faire (c'est-à-dire degatsArme).
- boirePotionDeVie : le personnage boit une potion de vie et regagne un certain nombre de points de vie.
- changerArme : le personnage récupère une nouvelle arme plus puissante. On change le nom de l'arme et les dégâts qui vont avec.
- estVivant : renvoie vrai si le personnage est toujours vivant (+ que 0 points de vie), renvoie faux sinon.
Voilà c'est un bon début je trouve.
On va rajouter ça dans la classe avant les attributs (on préfère présenter les méthodes
avant les attributs en POO, bien que ça ne soit pas obligatoire) :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | class Personnage
{
// Méthodes
void recevoirDegats(int nbDegats)
{
}
void attaquer(Personnage &cible)
{
}
void boirePotionDeVie(int quantitePotion)
{
}
void changerArme(string nomNouvelleArme, int degatsNouvelleArme)
{
}
bool estVivant()
{
}
// Attributs
int m_vie;
int m_mana;
string m_nomArme;
int m_degatsArme;
};
|
Ceci dit, vous devriez déjà avoir une petite idée de ce que vous allez mettre dans ces méthodes.
Par exemple,
recevoirDegats retranchera le nombre de dégâts indiqués en paramètre par nbDegats à la vie du personnage.
Intéressante aussi : la méthode
attaquer. Elle prend en paramètre... un autre personnage, plus exactement une référence vers le personnage cible que l'on doit attaquer ! Et que fera cette méthode à votre avis ? Eh oui, elle appellera la méthode recevoirDegats de la cible pour lui infliger des dégâts.
Vous commencez à comprendre un peu comment tout cela est lié et terriblement logique ?

On met en général un peu de temps avant de "penser objet" correctement. Si vous vous dites que vous n'auriez pas pu inventer un truc comme ça tout seul, rassurez-vous, tous les débutants passent par là. A force de pratiquer, ça va venir.
Pour info, toutes les méthodes que l'on pourrait créer ne sont pas là : par exemple, on n'utilise pas de magie (mana) ici. Le personnage attaque seulement avec une arme (une épée par exemple) et n'utilise donc pas de sorts magiques. Je laisse exprès quelques fonctions manquantes pour vous inciter à compléter la classe avec vos idées.
En résumé : comme je vous l'avais dit, un objet est bel et bien un mix de "variables" (les attributs) et de "fonctions" (les méthodes). La plupart du temps, les méthodes lisent et modifient les attributs de l'objet pour le faire évoluer.
Un objet est au final un petit système intelligent et autonome qui est capable de surveiller son bon fonctionnement tout seul.