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):
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
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).
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?