Classe Policiers C++

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++.

SOLUTION :

 
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam