ciao a tutti...mi sono da poco registrata perchè trovo molto utile questo forum..sto preparando un esame di programmazione orientata agli oggetti e non avendo alcun aiuto non so se sto sbagliando oppure no...vi posto quello che ho fatto e volevo chiedervi se mi potete aiutare nell'ultima parte dell'implementazione che non riesco a fare...
traccia:
Si realizzi in C++ una classe template Lista, (il Nodo della lista sia realizzato mediante il costrutto class). La Lista fornisce le seguenti funzioni membro (oltre al costruttore e distruttore):
Si erediti da Lista la classe Mappa, che è una lista istanziata dove T è la classe Coppia avente le variabili membro key e data, rispettivamente di tipo KTYPE e DTYPE definiti mediante typedef (ad esempio KTYPE è int e DTYPE di tipo string). Si forniscano sulla classe Coppia le seguenti funzioni membro: costruttore con argomenti, funzioni get, overloading dell’operatore == (per verificare se due coppie sono uguali) e dell’operatore << che stampa a video una coppia ad esempio nel formato (key,data).codice:void inserisci(T el); // va bene anche una push bool rimuovi(T el); // rimuove l'elemento el bool vuota() const; bool piena() const; bool esiste(T el) const; void stampa() const; int size() const; // restituisce il numero di nodi nella lista
La Mappa definisce una nuova funzione membro:
• Coppia trova(KTYPE k) const;
se nella mappa esiste una coppia con la chiave k, viene restituita tale coppia; altrimenti viene lanciata un'eccezione (ad esempio un oggetto di una classe Eccezione avente una stringa come variabile membro)
La classe Mappa ridefinisce due funzioni membro della classe Lista:
• void inserisci(Coppia c);
se nella mappa non esiste alcuna coppia con la stessa chiave di c, la coppia viene inserita nella mappa (usando la funzione inserisci di Lista); altrimenti viene lanciata un'eccezione di tipo Eccezione.
• bool rimuovi(KTYPE k);
se nella mappa esiste una coppia con la chiave k, la coppia viene eliminata (usando la funzione rimuovi di Lista); altrimenti viene lanciata un'eccezione un'eccezione di tipo Eccezione
ALLORA: QUESTO è IL CODICE CHE HO FATTO:
codice://coppia.h #ifndef COPPIA_H_ #define COPPIA_H_ #include <iostream> #include <string.h> using namespace std; typedef int KTYPE; typedef char* DTYPE; //classe coppia class Coppia{ private: KTYPE key; DTYPE data; public: Coppia(const KTYPE K=0, const DTYPE D=""); //costruttore con argomenti KTYPE getKey()const{return key;} DTYPE getData()const{return data;} ~Coppia(){delete []data;} friend bool operator== (const Coppia &, const Coppia& ); //overloading == friend ostream&operator<< (ostream&, const Coppia& ); }; #endif //coppia.cpp #include "coppia.h" //costruttore con argomenti Coppia ::Coppia(const KTYPE K, const DTYPE D){ key=K; delete[]data; data=new char[strlen(D)+1]; strcpy(data,D); } //ridefinizione == bool operator==(const Coppia & C1, const Coppia &C2){ if (C1.key==C2.key || C1.data==C2.data) return true; else return false; } //operatore << ostream&operator<< (ostream&out, const Coppia &C){ out<<"\n (key"<<C.key<<","<<C.data<<")"<<endl; return out; } //eccezione.h #ifndef ECCEZIONE_H_ #define ECCEZIONE_H_ #include <iostream> #include <string.h> using namespace std; class Eccezione{ private: string msg; public: Eccezione():msg("Errore. La chiave non esiste nella lista"){} const string what()const{return msg;} }; #endif //template lista.h #ifndef LISTA_H_ #define LISTA_H_ #include <iostream> #include "coppia.h" using namespace std; template <class T> class Lista; //classe nodo template <class T>class Nodo{ friend class Lista<T>; private: T elem; //elementi di tipo T Nodo<T>* succ; //puntatore al nodo successivo }; //classe lista template <class T> class Lista{ typedef Nodo<T>* P; friend ostream& operator<< <>(ostream& out, const Lista<T> & L); private: P testa; public: Lista(){testa=0;}//costruttore ~Lista(){clear();} //distruttore void push(const T ); void pop(T); void rimuovi(const T ); bool empty()const{return testa==0;} bool full()const{return false;} void clear(); void stampa()const; bool esiste(const T)const; int size()const; //restituisce il numero di nodi della lista }; //implementazione //push template<class T> void Lista<T>::push(const T e){ P q= new Nodo<T>; q->elem=e; q->succ=testa; testa=q; } //pop template <class T> void Lista<T>::pop(T e){ e=testa->elem; P q=testa; testa=testa->succ; delete q; } //esiste template <class T> bool Lista<T>::esiste(T el) const { P temp = testa; while (temp) { if (temp->elem == el) return true; temp = temp->succ; } return false; } //rimuovi un elemento dalla lsita template <class T> void Lista<T>::rimuovi(const T e){ P temp; if(testa->elem=e) pop(e); //se l'elemento che cerco è in testa, chiamo la pop else{ if(esiste(e)){ P x=temp->succ; temp->succ=temp->succ->succ; delete x; } else cout<<"\n l'elemento non e' presente nella lista"<<endl; } } //distruttore template <class T> void Lista<T> :: clear(){ P temp; while(testa){ temp=testa; testa=testa->succ; delete temp; } } //stampa template <class T> void Lista<T>::stampa()const{ P q=testa; while(q){ cout<<q->elem<<' '; q=q->succ; } } //numero di nodi template <class T> int Lista<T>::size()const{ int nodi=0; if(empty()) nodi=0; else{ P q=testa; while(q){ nodi=nodi+q->elem; q=q->succ; } } return nodi; } //<< template <class T> ostream&operator <<(ostream&out, const Lista<T>&L){ Nodo<T>* temp = L.testa; out << "["; while (temp) { out << temp->elem<< " "; temp = temp->succ ; } out << "]"; return out; } #endif //mappa.h che è template giusto? #ifndef MAPPA_H_ #define MAPPA_H_ #include "lista.h" #include "eccezione.h" template <class Coppia> class Mappa; template <class Coppia> class Mappa: public Lista<Coppia>{ public: Coppia trova(KTYPE k) const throw(Eccezione); void inserisci(Coppia c) throw (Eccezione); bool rimuovi(KTYPE k) throw (Eccezione); }; #endif
ora il mio problema è come implemento (semmai avessi fatto bene ) la classe template mappa?![]()

Rispondi quotando