Au chapitre précédent, vous avez vu que la programmation orientée objet pouvait nous simplifier la vie en masquant, en quelque sorte, le code complexe. C'est un des avantages de la POO mais ce n'est pas le seul, comme vous allez le découvrir petit à petit : les objets sont aussi facilement réutilisables et modifiables.
À partir de maintenant, nous allons apprendre à créer des objets. En effet, on peut créer un objet de 100 façons différentes, et c'est à nous de choisir à chaque fois la meilleure, la plus adaptée. Ce n'est pas évident, il faut donc bien réfléchir avant de se lancer dans le code comme un forcené.
Allez, on prend une grande inspiration et on plonge ensemble dans l'océan de la POO !
Créez une classe
Commençons par la question que vous devez vous poser.
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 fait la classe (le plan), vous pouvez 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.
Reprenons l'exemple sur l'architecture : allons-nous créer un appartement, une villa avec piscine, un loft spacieux ? En clair, quel type d'objet voulons-nous être capables 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 n'avez pas trop le choix, de toute façon !). Pour notre exemple, nous allons créer une classe Personnage
qui va représenter un personnage de jeu de rôle (RPG).
Bon, on la crée cette classe ?
C'est parti !
Voici le code minimal pour créer une classe :
class Personnage
{
}; // N'oubliez pas le point-virgule à la fin !
Comme vous le voyez :
On utilise le mot-clé
class
.Suivi du nom de la classe que l'on veut créer. Ici, c'est
Personnage
.
Ajoutez des méthodes et des 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 ?
C'est justement l'étape de réflexion, la plus importante.
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.
Définissez 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.
OK, 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, cela 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, 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 sort magique et doit attendre que son mana se recharge tout seul 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 pour cela une
string
.Enfin, il me semble indispensable d'ajouter un attribut degatsArme, un
int
qui indiquerait cette fois le degré de dégâts que porte notre arme à chaque coup.
On peut donc déjà commencer à compléter la classe avec ces premiers attributs :
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) ont l'habitude de faire commencer tous les noms des attributs de classe par "m_" ; c'est 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.
Implémentez les méthodes
Les méthodes, elles, sont grosso modo les actions que le personnage peut effectuer ou qu'on peut lui faire faire.
Voici quelques actions réalisables avec notre personnage :
recevoirDegats
: le personnage prend un certain nombre de dégâts et donc perd de la vie.attaquer
: le personnage attaque un autre personnage avec son arme. Il inflige autant de dégâts que son arme le lui permet (c'est-à-diredegatsArme
).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
: renvoietrue
si le personnage est toujours vivant (il possède plus que 0 point de vie), sinon renvoiefalse
.
C'est un bon début, je trouve.
On va rajouter cela dans la classe avant les attributs (en POO, on préfère présenter les méthodes avant les attributs, bien que cela ne soit pas obligatoire) :
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 :
recevoirDegats
retranche le nombre de dégâts (indiqués en paramètre parnbDegats
) à la vie du personnage ;attaquer
prend en paramètre... un autre personnage, plus exactement une référence vers le personnage cible que l'on doit attaquer, et elle appellera la méthoderecevoirDegats
de la cible pour lui infliger des dégâts.
Pour info, cette classe ne comporte pas toutes les méthodes que l'on pourrait y créer : par exemple, on n'utilise pas de magie ici. Le personnage attaque seulement avec une arme (une épée, par exemple) et n'emploie donc pas de sort. Je laisse exprès quelques fonctions manquantes pour vous inciter à compléter la classe avec vos idées.
En résumé
Il est nécessaire de créer une classe pour pouvoir ensuite créer des objets.
La classe est le plan de construction de l'objet.
Une classe est constituée d'attributs et de méthodes (variables et fonctions).
Vous savez maintenant créer une classe. Nous allons maintenant nous intéresser au concept le plus fondamental de la POO : la gestion des droits d'accès et l'encapsulation.