[c++] dubbio template.

di il
1 risposte

[c++] dubbio template.

Ciao a tutti...mi sono da poco registrata perchè trovo molto utile questo forum..sto esercitandomi sulla programmazione ad oggetti,ma 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):
 
    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:
  //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 ?

1 Risposte

  • Re: [c++] dubbio template.

    Io farei la classe copia come template quindi non sei limitato a int e string. Mappa come derivata di lista<T> e aggiunta di funzioni specializzate solo se il T è una classe di tipo coppia. Controlla intanto l'overload di == perche non é corretto.
Devi accedere o registrarti per scrivere nel forum
1 risposte