//Menu : menu.cpp #include <iostream.h> #include <stdlib.h> #include <string.h> #include "menu.h" /******************************************************/ /* Classe menu */ /******************************************************/ menu::menu (TPtr &base,char *n) : list<menu> (base) // Costruttore della superclasse (appende alla lista) { voce = new char [strlen (n) + 1]; // Alloca lo spazio per il nome del menu if (voce) // Se e' riuscito ad allocare strcpy (voce,n); // Ci copia il nome del menu' } /* Funzione ricorsiva che stampa tutte le voci del menu', * precedute dal numero, che sara' il modo per selezionera il * menu' stesso. * Il numero della vaco va passata come parametro, quindi noi * la invocheremo sulla prima voce del menu', con il numero 1. * Dopo il menu' stampa un prompt, legge l'input dell'utente, * lo trasforma in numero (e' la selezione) e lo ritorna */ int menu::print (int curr) { cout << curr << ")" << voce << endl; // Stampa 'n) nome menu' if (Next ()) // Se non e' l'ultimo menu' return Next () -> print (curr + 1); // Richiema la prossima voce, per stamparla (aggiorna il numero) else { // Ho stampato l'ultimo elemento, scelta: int i; // Numero scritto dall'utente cout << "Fai la tua scelta: "; // Prompt cin >> i; // Legge la risposta dell'utente cin.ignore (10,'\n'); // Arriva fino all' 'a capo' return i; // Ritorna il numero introdotto } } /* Funzione che individua la voce scelta e lancia l'azione per quella voce */ void menu::doaction (int n,void *par) { menu *m = (list<menu>::operator[] (n)); // Individua la voce usando i metodi della superclasse 'list<menu>' if (m) // Se l'elemento selezionato esiste (non ho dato un numero troppo grande) m -> action (par); // Richiamo il suo metodo 'action' (virtuale) } menu::~menu () { if (voce) // Se il menu' ha il nome (e' riuscito ad allocarlo) delete voce; // libera lo spazio del nmome } /******************************************************/ /* Classe menuexit */ /******************************************************/ void menuexit::action (void *par) { #pragma argsused (par) // serve per eliminare il warning 'parametro non utilizzato' exit (0); // Azione (guarda un po'.. ;-> ) exit }