//Capo: capo.cpp // Definisce: Capo, Cintura, Vestiario #include <iostream.h> #include <iomanip.h> #include "capo.h" /******************************************************/ /* Classe Capo */ /******************************************************/ /* Operatore di confronto (diverso). * Ritrona 'true' (-1) se un capo uguale a 'c' non e' compreso nella lista corrente, * 'false' (0) se e' contenuto */ int Capo::operator != (Capo *c) { if (!c) // Se non ho la lista dei capi return -1; // Allora non ci sara' di sicuro dentro if (Genere != c -> Genere || // Se e' diverso il genere Modello != c -> Modello) // Oppure e' diverso il modello { if (Next ()) // Se c'e' un altro elemento in lista return Next () != c; // Esegue il confronto sul resto della lista (niente cast, uso template) else // Se la lista e' finita, allora return -1; // Non e' contenuto nella lista, quindi 'true' } return 0; // Altrimenti ritorna 'false' - non sono diversi } /* Operatore di confronto (uguale): ritorna 'true' se il capo corrente * corrisponde ai criteri contenuti nella lista 'l', 'false' altrimenti */ int Capo::operator == (AttrList *l) { return *l == Genere && // La lista deve corrispondere al genere *l == Modello; // ed anche al modello (uso operator == di 'Attrlist') } void Capo::Pausa (int num) { if ((num%24) == 0) // Se il numero corrente (la riga) e' divisibile per 24 { cout << "Premi A-Capo per continuare"; // Stampa un prompt cin.ignore (10,'\n'); // Ed attende un carattere } } void Capo::show (int num) { Pausa (num); // controlla se fermarsi cout << setw (2) << num << "|" << // formatta la linea setw (30) << setiosflags (ios::left) << Genere.val () << "|" << setw (30) << Modello.val () << setiosflags (ios::right) << "| |" << endl; if (Next ()) // se c'e' un nuovo capo Next () -> show (num + 1); // continua la stampa (niente cast, uso template) } /******************************************************/ /* Classe Cintura */ /******************************************************/ /* Operatore di confronto (diverso). * Ritrona 'true' (-1) se un capo uguale a 'c' non e' compreso nella lista corrente, * 'false' (0) se e' contenuto */ int Cintura::operator != (Capo *c) { if (!c) // Se non ho la lista dei capi return -1; // Allora non ci sara' di sicuro dentro if (Genere != ((Cintura *)c) -> Taglia) // Se la taglia e' diversa { if (Next ()) // Se c'e' un altro elemento in lista return Next () != c; // Esegue il confronto sul resto della lista (niente cast, uso template) else // Se la lista e' finita, allora return -1; // Non e' contenuto nella lista, quindi 'true' } else return Capo::operator != (c); // Se la taglia non corrisponde, confronta il resto della lista } /* Operatore di confronto (uguale): ritorna 'true' se il capo corrente * corrisponde ai criteri contenuti nella lista 'l', 'false' altrimenti */ int Cintura::operator == (AttrList *l) { return Capo::operator == (l) && // La lista deve corrispondere secondo i criteri di 'Capo' *l == Taglia; // ed anche per la Taglia } void Cintura::show (int num) // identica a quella della superclasse, ma stampa tutti gli attributi { Pausa (num); cout << setw (2) << num << "|" << setw (30) << setiosflags (ios::left) << Genere.val () << "|" << setw (30) << Modello.val () << setiosflags (ios::right) << "|" << setw (3) << Taglia.val () << "|" << endl; if (Next ()) Next () -> show (num + 1); // (niente cast, uso template) } /******************************************************/ /* Classe Vestiario */ /******************************************************/ /* Operatore di confronto (diverso). * Ritrona 'true' (-1) se un capo uguale a 'c' non e' compreso nella lista corrente, * 'false' (0) se e' contenuto */ int Vestiario::operator != (Capo *c) { if (!c) // Se non ho la lista dei capi return -1; // Allora non ci sara' di sicuro dentro if (Genere != ((Vestiario *)c) -> Colore) // Se il colore e' diverso { if (Next ()) // Se c'e' un altro elemento in lista return Next () != c; // Esegue il confronto sul resto della lista (niente cast, uso template) else // Se la lista e' finita, allora return -1; // Non e' contenuto nella lista, quindi 'true' } else return Cintura::operator != (c); // Se la taglia non corrisponde, confronta il resto della lista } /* Operatore di confronto (uguale): ritorna 'true' se il capo corrente * corrisponde ai criteri contenuti nella lista 'l', 'false' altrimenti */ int Vestiario::operator == (AttrList *l) { return Cintura::operator == (l) && // La lista deve corrispondere secondo i criteri di 'Capo' *l == Colore; // ed anche per il Colore } void Vestiario::show (int num) // identica a quella della superclasse, ma stampa tutti gli attributi { Pausa (num); cout << setw (2) << num << "|" << setw (30) << setiosflags (ios::left) << Genere.val () << "|" << setw (30) << Modello.val () << setiosflags (ios::right) << "|" << setw (3) << Taglia.val () << "|" << Colore.val () << endl; if (Next ()) Next () -> show (num + 1); // (niente cast, uso template) }