Programmer en C++
Les classes

Les exemples qui suivent ont été testés en utilisant "Microsoft Visual C++ 2008 Express".

1. Création des fichiers nécessaires

Pour simplifier, on partira d'un programme principal de base possédant le code suivant :

#include <iostream>

using namespace std;

int main()
{
    return 0;
}


Dans la fenêtre "Explorateur de solution", nous créons un fichier "personnage.h" dans le dossier "Fichiers d'en-tête",
et "personnage.cpp" dans le dossier "Fichiers de ressources".

2. Création de la classe

C'est dans le fichier d'en-tête "personnage.h" que nous allons définir notre classe.
Ne perdons pas de temps, écrivons :

#include <iostream>

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

#endif

Explication : Un fichier .h ne doit être lu qu'une seule fois. C'est le rôle des 3 dernièrss lignes qui n'autoriserons qu'une lecture unique du contenu se trouvant entre #define PERSONNAGE_H, et #endif.
Nous voilà prêt pour écrire notre classe. Allons y :

#include <iostream>

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

class personnage
{
};     // Ne pas oublier le ;

#endif

Voilà nous venons de créer notre classe, mais pour l'instant elle est vide et ne fait rien.
Toutefois, avant d'aller plus loin, il faut indiquer au programme principal que cette classe existe, et qu'elle pourra donc l'utiliser.
Nous ajoutons donc la ligne #include "personnage.h" dans l'en_tête du fichier "main.cpp".

#include <iostream>

#include "personnage.h"

using namespace std;

int main()
{
    return 0;
}

3. Variable membre d'une classe

Il est temps maintenant de faire quelque chose de cette classe. Une classe contient des variables membres. Ce sont des informations mais qui ne doivent pas être accessibles directement de l'extérieur. On dit que ce sont des variables privées. Ces variables sont écrites après le mot clef "private:"
Dans les jeux par exemple, les personnages ont des points de vie. Nous allons donc stocker cette information dans la variable m_pointdevie.
Assez d'explication, complétons notre programme.

#include <iostream>

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

class personnage
{
private:
    // Mes variables membres
    int m_pointdevie;
};     // Ne pas oublier le ;

#endif

J'ai mes points de vie, et il suffit donc de mettre une valeur ici ? Non pas du tout !
Pour initialiser les valeurs d'une variable membre d'une classe, il faut un "Constructeur".
Qu'est ce que c'est ? Un peu de patience, nous allons le découvrir.

4. Constructeur

Sachons premièrement qu'un constructeur doit être accessible à partir du programme principal (le main.cpp).
Dans le fichier "personnage.h", nous devons donc écrire le mot clef "public:" précédant notre constructeur.
Un constructeur est une fonction qui possède le même nom que celui de la classe à qui il appartient.

#include <iostream>

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

class personnage
{
public:
    personnage();     // Constructeur

private:
    // Mes variables membres
    int m_pointdevie;
};     // Ne pas oublier le ;

#endif

Ah ça y est, je vois le constructeur, mais il ne fait rien ?
En effet, le fichier "personnage.h" ne fait que déclarer la classe. Pour définir ce que fait cette classe, il faut maintenant se rendre dans le fichier "personnage.cpp" que nous avons laissé vide pour l'instant.
Commençons par écrire #include "personnage.h". Il faut bien que ce fichier sache de quoi on parle.
Ecrivons ensuite personnage::
Oh cool un menu s'ouvre me proposant plusieurs choix. Je clique sur personnage() et je valide avec entrée.
Terminons en écrivant les quelques lignes suivantes :

#include "personnage.h"

personnage::personnage()     // Constructeur
{
    m_pointdevie = 100;     // Mes points de vie sont initialisés ici à 100
}

Super je viens de créer une classe avec la possibilité de stocker des points de vie. Mais j'ai lu plus haut qu'il n'était pas possible d'accéder directement à cette valeur à partir du programme principal !
On fait comment alors pour les obtenir ?

5. Fonction membre d'une classe

Nous voulons lire les points de vie à partir du programme principal. Il nous faut donc commencer par déclarer une fonction publique. Dans le fichier "personnage.h", nous écrivons à la suite du constructeur :
int lirePointDeVie();
Voilà ce que ça donne :

#include <iostream>

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

class personnage
{
public:
    personnage();     // Constructeur
    int lirePointDeVie();     // Permet d'obtenir les points de vie.

private:
    // Mes variables membres
    int m_pointdevie;
};     // Ne pas oublier le ;

#endif

Maintenant que notre fonction est déclarée, allons dans le fichier "personnage.cpp" pour définir cette fonction.
On attend ici le retour d'une valeur entière. Il faut donc commencer par écrire "int", puis personnage suivi de ::
Miracle encore ! Notre logiciel de programmation à l'air de se souvenir de tout ce que nous avons fait précédemment, et nous propose plusieurs choix :

Je choisis la fonction "lirePointDeVie()", et je complète comme ci-dessous :

#include "personnage.h"

personnage::personnage()     // Constructeur
{
    m_pointdevie = 100;     // Mes points de vie sont initialisés ici à 100
}

int personnage::pointDeVie()

Tout ce travail pour simplement obtenir quelques points de vie ! Est ce vraiment si utile ?
Pour ce petit exemple pas vraiment, mais lorsque les programmes deviennent plus longs on a vite tendance a s'y perdre. Les classes ont l'avantage de clarifier le programme principal pour n'avoir à s'occuper que de l'essentiel.
Poursuivons maintenant en revenant dans notre programme principal qui pour l'instant ne fait pas grand chose.

6. Utilisation d'une classe dans le programme principal

Pour créer un personnage, il suffit d'écrire le nom de la classe "personnage", suivi d'un espace et du nom choisi (j'ai choisi Polo).
Si j'en veux un deuxième qui s'appelle "Marco" ?
Tout simple, j'écris : personnage Marco;
Et maintenant si je veux voir les points de vie ?
J'écris ce qui suit :

#include <iostream>
#include "personnage.h"

using namespace std;

int main()
{
    personnage Polo;
    personnage Marco;
    cout << "Polo a " << Polo.lirePointDeVie() << "points de vie " << endl;
    cout << "Marco a " << Marco.lirePointDeVie() << "points de vie " << endl;

    return 0;
}

Une fois compilé (F7, puis ensuite CTRL + F5), on obtient :