/* IFT1166 - démonstration #9 - exercice 07 18-novembre -2005 v1.01 M.Lokbani - MàJ pour A05 27-juin -2000 v1.00 M.Lokbani - énoncé examen final Été 2000. contact: lokbani@iro.umontreal.ca Copyright (C) 2003-2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Dans cette exercice vous allez programmer une représentation d'un carnet d'adresses postales. Une adresse postale, peut avoir différents formats ; par exemple, pour un envoi international du Canada vers les USA, nous devons préciser le pays receveur de la lettre (ici USA) alors que pour un envoi à l'intérieur du Canada cela n'est pas nécessaire. Le format d'écriture de l'adresse est, quant à lui, dépendant du pays expéditeur. */ #include using namespace std; class Adresse { public: virtual const char* type() const = 0; virtual void affiche(int international=0) const = 0; virtual void saisir() = 0; virtual ~Adresse(){} }; class AdressePostale : public Adresse { public: virtual ~AdressePostale(){ delete [] nom; delete [] rue; delete [] numero; delete [] ville; delete [] codepostale; delete [] pays; } const char* type() const { return "Adresse Postale"; } protected: AdressePostale(){ nom = NULL; rue = NULL; numero = NULL; ville = NULL; codepostale = NULL; pays = NULL; } void saisirnom(const char* n){ remplace(nom,n); } // il aura été plus intéressant de faire une fonction qui retourne // le membre au lieu de l'afficher, mais bon … void affichenom() const { cout << nom; } void saisirrue(const char* n){ remplace(rue,n); } void afficherue() const { cout << rue; } void saisirnumero(const char* n){ remplace(numero,n); } void affichenumero() const { cout << numero; } void saisirville(const char* n){ remplace(ville,n); } void afficheville() const { cout << ville; } void saisircodepostale(const char* n){ remplace(codepostale,n); } void affichecodepostale() const { cout << codepostale; } void saisirpays(const char* n){ remplace(pays,n); } void affichepays() const { cout << pays; } private: char* nom; char* rue; char* numero; char* ville; char* codepostale; char* pays; void remplace (char* data, const char* n) { if (data != n) { delete [] data; data = new char[strlen(n)+1]; strcpy(data,n); } } // // fonctions membres déclarées privées pour les désactiver AdressePostale(const AdressePostale&); AdressePostale& operator=(const AdressePostale&); }; class AdresseCanada:public AdressePostale { public: AdresseCanada():AdressePostale() { saisirpays("Canada"); } virtual void affiche(int international=0) const { affichenom(); cout << endl; affichenumero(); cout << ' '; afficherue(); cout << endl; afficheville(); cout << endl; if (international) {affichepays(); cout << endl;} affichecodepostale(); cout << endl; } virtual void saisir() { string buffer=""; cout << "Nom: " << flush; cin>>buffer; saisirnom(buffer.c_str()); cout << "Rue: " << flush; buffer=""; cin>>buffer; saisirrue(buffer.c_str()); cout << "Numéro: " << flush; buffer=""; cin>>buffer; saisirnumero(buffer.c_str()); cout << "Code postale: " << flush; buffer=""; cin>>buffer; saisircodepostale(buffer.c_str()); cout << "Ville: " << flush; buffer=""; cin>>buffer; saisirville(buffer.c_str()); } }; class AdresseUSA:public AdressePostale { public: AdresseUSA():AdressePostale() { saisirpays("USA"); } virtual void affiche(int international=0) const { affichenom(); cout << endl; affichenumero(); cout << ' '; afficherue(); cout << endl; afficheville();cout << ' '; affichecodepostale(); cout << endl; if (international) {affichepays(); cout << endl;} } virtual void saisir() { string buffer=""; cout << "Nom: " << flush; buffer=""; cin >> buffer; saisirnom(buffer.c_str()); cout << "Rue: " << flush; buffer=""; cin >> buffer; saisirrue(buffer.c_str()); cout << "Numéro: " << flush; buffer=""; cin >> buffer; saisirnumero(buffer.c_str()); cout << "Code postale: " << flush; buffer=""; cin >> buffer; saisircodepostale(buffer.c_str()); cout << "Ville: " << flush; buffer=""; cin >> buffer; saisirville(buffer.c_str()); } };