// Classe lista: listc.h #ifndef LISTC_H #define LISTC_H /* Creo una classe base per le liste, in modo da creare la classe * template che contiene solo funzioni inline. * Tutti i membri sono protected, perche' verranno usati dalla * classe template list * Tutti i metodi hanno nomi diversi da quelli del template, per * evitare conflitti nella risoluzione del template */ class list_base { protected: list_base *next; // Link della catena list_base *index (int i, int curr = 1); // Elemento num. (da 1) void concat (list_base *add); // Concatena due liste void remove_base (list_base **base); // elimina da lista }; /* Classe template list * Per consentire di gestire elementi di tipi diversi (derivati), con gli * opportuni tipi di ritorno e per i parametri, deve essere una classe * template. * La classe base list_base e' private, perche' i metodi e attributi di * list_base devono essere gestiti solo dalle classi template */ template <class T> class list : private list_base { protected : // Definisco un tipo puntatore a classe finale, per costruire // variabili passate per riferimento (un puntatore non va bene) typedef T *TPtr; public : // Costruttore: si aggiunge in testa ad una lista 'base' list (TPtr &base) { next = (list *) base; base = (T*) this;}; // Ritorna il valore del prossimo elemento T *Next () { return (T*) next; }; // Operatore indice: ritorna l'elemento i-esimo (a partire da 1) // ATTENZIONE: si applica agli OGGETTI, non ai PUNTATORI!!! T *operator [] (int i) { return ((T*)index (i)); }; // Distruttore virtuale - distrugge tutti gli elementi della lista virtual ~list () { if (next) delete next; }; // Elimina l'elemento corrente dalla lista in cui e' contenuto void remove (TPtr &base) { remove_base ((list_base **) &base); }; // Concatena la seconda lista alla prima void operator += (T *add) { concat ((list_base*) add); }; }; #endif