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?