PDA

Visualizza la versione completa : [c++]dubbio template


alidelmondo
24-06-2013, 13:29
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):



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? :cry:

Loading