EXERCICE CORRIGE C++ / Gestion des Policiers en C++
Énoncé Adapté pour la Classe Policier
Un Policier est défini par son matricule , son nom et son grade . Le matricule est un entier géré uniquement par la classe. Pour ce faire, cette classe possède un membre statique `nbrePoliciers` initialisé à zéro et incrémenté à chaque création d'un policier par un constructeur.
Question A1 : Définir la classe ainsi décrite.
On suppose que le fichier `policier.h` contient les entêtes des méthodes suivantes :
Ajoute un constructeur d'initialisation (par défaut), un constructeur de recopie et un constructeur avec arguments.
```cpp
- Policier(string nom, string grade); // Constructeur à deux arguments
- string getGrade() const; // Accesseur en consultation sur le grade
- void setGrade(string grade); // Accesseur en modification sur le grade
- static int getNbrePoliciers(); // Accesseur en consultation sur le nombre de policiers
- virtual void afficher() const; // Affiche le matricule, le nom et le grade du policier
- static Policier enregistrer(); // Lit un nom et un grade, puis retourne ce policier
- bool operator==(const Policier &p); // Deux policiers sont égaux s'ils ont le même matricule
```
---
Question A2 : Donner un corps à chacune des méthodes sous forme de 3 fichiers
1. Fichier d'en-tête (`policier.h`)
#ifndef POLICIER_H
#define POLICIER_H
#include <string>
using namespace std;
class Policier {
private:
static int nbrePoliciers; // Compteur de policiers (statique)
int matricule; // Identifiant unique
string nom; // Nom du policier
string grade; // Grade (ex: "Lieutenant", "Capitaine")
public:
// Constructeurs
Policier(); // Par défaut
Policier(const Policier& p); // De recopie
Policier(string nom, string grade); // Paramétré
// Accesseurs
string getGrade() const;
void setGrade(string grade);
static int getNbrePoliciers();
// Méthodes
virtual void afficher() const; // expliquez le reole de virtual en TP !
static Policier enregistrer();
bool operator==(const Policier &p);
};
#endif
2. Fichier d'implémentation (`policier.cpp`)
#include "policier.h"
#include <iostream>
// Initialisation du compteur statique
int Policier::nbrePoliciers = 0;
Policier::Policier() {
matricule = ++nbrePoliciers;
nom = " ";
grade = "Stagiaire";
}
// Constructeur de recopie (avec syntaxe demandée)
Policier::Policier(const Policier& p) {
matricule = ++nbrePoliciers;
nom = p.nom;
grade = p.grade;
}
// Constructeur paramétré
Policier::Policier(string nom, string grade) {
matricule = ++nbrePoliciers;
this->nom = nom;
this->grade = grade;
}
// Accesseurs
string Policier::getGrade() const { return grade; }
void Policier::setGrade(string grade) { this->grade = grade; }
int Policier::getNbrePoliciers() { return nbrePoliciers; }
// Méthode d'affichage
void Policier::afficher() const {
cout << "Matricule: " << matricule << " | Nom: " << nom << " | Grade: " << grade << endl;
}
// Méthode statique pour créer un policier via saisie
Policier Policier::enregistrer() {
string nom, grade;
Policier *ptPoli;
cout << "Nom du policier : ";
cin >> nom;
cout << "Grade : ";
cin >> grade;
ptPoli = new Policier(nom, grade);
return *ptPol;
}
// Surcharge de l'opérateur == (comparaison par matricule)
bool Policier::operator==(const Policier &p) {
return (this->matricule == p.matricule);
}
*3. Fichier de test (`main.cpp`)**
#include "policier.h"
#include <iostream>
int main() {
// Test constructeur paramétré
Policier p1("Dupont", "Lieutenant");
p1.afficher();
// Test constructeur de recopie
Policier p2 = p1;
p2.setGrade("Capitaine");
p2.afficher();
// Test saisie interactive
cout << "\nEnregistrement d'un nouveau policier :\n";
Policier p3 = Policier::enregistrer(); // expliquez ceci en TP
p3.afficher();
// Test comparaison
if (p1 == p3) // ca marche grace redefinition de ==
cout << "Même policier (anomalie)";
else
cout << "Policiers différents (normal)";
// Affichage du nombre total de policiers
cout << "\nEffectif total : " << Policier::getNbrePoliciers() << " policiers\n";
return 0;
}
Rôle détaillé de chaque méthode**
1. **Constructeurs**
- `Policier()` : Initialise un policier avec des valeurs par défaut.
- `Policier(const Policier&)` : Crée une copie indépendante avec un nouveau matricule.
- `Policier(string, string)` : Initialise un policier avec nom et grade personnalisés.
2. **Accesseurs**
- `getGrade()` : Retourne le grade (lecture seule).
- `setGrade()` : Modifie le grade.
- `getNbrePoliciers()` : Retourne le nombre total de policiers (statique).
3. **Méthodes**
- `afficher()` : Affiche les détails du policier.
- `enregistrer()` : Permet la saisie interactive d'un nouveau policier.
- `operator==` : Compare deux policiers par leur matricule.
4. **Gestion automatique des matricules**
- Le compteur statique `nbrePoliciers` garantit l'unicité des matricules.
---
### **Exécution du programme**
1. **Compilation** :
g++ policier.cpp main.cpp -o policier
2. **Résultat attendu** :
- Création de policiers avec matricules uniques.
- Affichage correct des informations.
- Comparaison fonctionnelle basée sur le matricule.
Cet exercice illustre parfaitement **l'encapsulation**, **la gestion des membres statiques**, et **la surcharge d'opérateurs** en C++.