C++: Correction Gestionnaire de rendez-vous

 

#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
class RendezVous;
 
char * StrDup(const char * _in) 
  char * buf = new char[strlen(_in)+1]; 
  strcpy(buf, _in); 
  return buf; 
}
 
class RendezVous
{
private:
  char * nom;
  char * date;
public:
  ~RendezVous() {
    delete nom; 
    delete date;
  }
 
  RendezVous(const char * _nom, const char * _date)
    : nom(StrDup(_nom)), date(StrDup(_date)) 
  { }
 
  RendezVous(const RendezVous & _autre) 
    : nom(StrDup(_autre.nom)), date(StrDup(_autre.date)) 
  { }
 
  void lireDepuis(istream & _in) {
    delete nom;
    delete date;
    char buf[1024];
    _in >> buf;
    nom = StrDup(buf);
    _in >> buf;
    date = StrDup(buf);
  }
 
  const RendezVous & operator = (const RendezVous & _autre) {
    if (this != &_autre) {
      delete nom;
      delete date;
      nom = StrDup(_autre.nom);
      date = StrDup(_autre.date);
    }
    return *this;
  }
 
  const char * get_date() const { return date; }
  const char * get_nom() const { return nom; }
 
  void set_date(const char * _date) {
    delete date;
    date = StrDup(_date);
  }
  void set_nom(const char * _nom) {
    delete nom;
    nom = StrDup(_nom);
  }
 
};
 
ostream & operator << (ostream & _out, const RendezVous & _rdv) {
  return _out << "RendezVous ( avec " << _rdv.get_nom() << " le " << _rdv.get_date() << ")";
}
 
bool operator == (const RendezVous & _1, const RendezVous & _2) {
  return (strcmp(_1.get_date(), _2.get_date()) == 0 && strcmp(_1.get_nom(), _2.get_nom()) == 0);
}
 
class Critere {
public:
  virtual bool prendre(const RendezVous * ) const  = 0;
};
 
class CritereDate : public Critere
{
  const char * date;
public:
  CritereDate(const char * _date) : date(_date) {} 
  virtual bool prendre(const RendezVous * rdv) const {
    return (strcmp(date, rdv->get_date()) == 0);
  }
};
 
class Carnet
{
private:
  int nb;
  RendezVous ** rdvs;
  void resize(int _gap) {
    RendezVous ** rdvs_new = new RendezVous*[nb+_gap];
    for (int i = 0; i < nb; i++) {
      rdvs_new[i] = rdvs[i];
    }
    delete rdvs;
    rdvs = rdvs_new;
  }
public:
  Carnet() : nb(0), rdvs(new RendezVous*) {}
  ~Carnet() {
    for (int i = 0; i < nb; i++) {
      delete rdvs[i];
    }
    delete rdvs;
  }
  const Carnet & operator = (const Carnet & _autre) {
    if(this != &_autre) {
      for (int i = 0; i < nb; i++) {
delete rdvs[i];
      }
      delete rdvs;
      nb = _autre.nb;
      rdvs = new RendezVous * [nb];
      for (int i = 0; i < nb; i++) {
rdvs[i] = new RendezVous(*(_autre.rdvs[i]));
      }
    }
    return *this;
  }
  Carnet (const Carnet & _autre) {
    nb = _autre.nb;
    rdvs = new RendezVous * [nb];
    for (int i = 0; i < nb; i++) {
      rdvs[i] = new RendezVous(*(_autre.rdvs[i]));
    }
  }
 
 
  const RendezVous & operator [] (int _pos) const {
    return *(rdvs[_pos]);
  }
 
  int get_nb() const { return nb; }
 
  void ajouterRendezVous(const char * _nom, const char * _date) {
    resize(nb+1);
    rdvs[nb++] = new RendezVous(_nom, _date);
  }
  void ajouterRendezVous(const RendezVous & _rdv) {
    resize(nb+1);
    rdvs[nb++] = new RendezVous(_rdv);
  }
  void retirerRendezVous(const char * _nom, const char * _date) {
    RendezVous buf(_nom, _date);
    retirerRendezVous(buf);
  }
  void retirerRendezVous(const RendezVous & _rdv) {
    int pos = positionRendezVous(_rdv);
    if (pos >= 0) {
      delete rdvs[pos];
      if (nb > 1) {
rdvs[pos] = rdvs[nb-1];
      }
      nb--;
    }
  }
 
  void retirerRendezVous(const Carnet & _autre) {
    for (int i = 0; i < _autre.get_nb(); i++) {
      retirerRendezVous(_autre[i]);
    }
  }
 
  int chercheRendezVous(const Critere * crit, Carnet & resultat) const {
    int rnb = 0;
    for (int i = 0; i < nb; i++) {
      if (crit->prendre(rdvs[i])) {
rnb++;
resultat.ajouterRendezVous(*( rdvs[i]));
      }
    }
    return rnb;
  }
 
  int chercheRendezVousDu(const char * _date, Carnet & resultat) const {
    CritereDate cd(_date);
    return chercheRendezVous(&cd, resultat);
  }
 
private:
  int positionRendezVous(const RendezVous & _rdv) {
    for (int i = 0; i < nb; i++) {
      if(*(rdvs[i]) == _rdv) {
return i;
      }
    }
    return -1;
  }
  friend ostream & operator << (ostream & _out, const Carnet & _carnet);
};
 
ostream & operator << (ostream & _out, const Carnet & _carnet) {
  _out << "--------------------------------------" << endl;
  for (int i = 0; i < _carnet.nb; i++) {
    _out << *(_carnet.rdvs[i]) << endl;
  }
  _out << "--------------------------------------" << endl;
}