//Attributo: Attr.cc // Implementazione della classe 'Attributo', 'AttrTaglia' #include <stdio.h> #include <string.h> #include "attr.h" /******************************************************/ /* Classe Attributo */ /******************************************************/ /* Confrota un attributo con un altro: * Ritorna: * 0 se a e' uguale a this * <0 se a e' inferiore a this * >0 se a e' superiore a this * Se confronto l'attributo con uno di tipo diverso, mi * risponde 'uguali' */ int Attributo::compare (const Attributo &a) { if (a.tipo != tipo) return 0; // Tipo diverso, quindi 'uguali' return strcmp (a.valore,valore); } /* Modifica il valore dell'attributo. * Il nuovo valore deve essere piu' corto del vecchio, * se no viene troncato. Questo garantisce che non si * ecceda la dimensione allocata */ void Attributo::changestr (char *s) { strncpy (valore,s,strlen (valore)); } /* Costruttore con parametri. * Inizializza tipo e valore */ Attributo::Attributo (const tipo_t t, const char *val) { int i; tipo = t; // Inizializza il tipo for (i = 0;val [i] > ' '; i++) // conta i caratteri 'stampabili' ; valore = new char [i + 1]; // Alloca la stringa per i soli stampabili if (valore) // Se ha allocato { strncpy (valore,val,i); // Copia il valore, per i soli caratteri stampabili valore [i] = 0; // Termina la stringa con il 'null' di rigore } } /* Costruttore per copia */ Attributo::Attributo (const Attributo &a) { Attributo (a.tipo , a.valore); // Usa il costruttore con parametri, per allocare // una nuova stringa } /* Distruttore */ Attributo::~Attributo () { if (valore) // Se la stringa e' stata allocata delete valore; // Libera la memoria } /******************************************************/ /* Classe AttrTaglia */ /******************************************************/ /* Costruttore con parametri. * Imposta la taglia a tre cifre */ AttrTaglia::AttrTaglia (const int val) : Attributo (taglia , "000") // Costruttore con stringa di tre cifre { char t [4]; // Stringa per creare la taglia a tre cifre (per i confronti) sprintf (t,"%03d",val % 999); // Ci mette dentro la taglia a tre cifre changestr (t); // Sostituisce '000' con la taglia vera }