Salve, stavo implementando una lista per una Gerarchia di classi: "Carta (classe astratta)" da cui derivano "Bancomat e TesseraSanitaria". Ho fatto una lista di "Carta *" in modo da abilitare l' uso polimorfo,costruendo la lista come di seguito il tutto funziona. Ma mi è sorta una domanda : data tale implementazione della lista, in tutte le funzioni per esempio in quella di Push, il codice
q->elem=E;
mi va a fare una copia dei puntatori? e non mi genera una lista che contiene elementi puntati dal puntatore Carta, quindi concettualmente tale implementazione è errata in quanto io voglio avere una lista di elementi e non di puntatori? Oppure tale implementazione è corretta in quanto a me serve una lista di puntatori per abilitare l' uso polimorfo? Grazie in anticipo.
"File Lista.h"
#ifndef _LISTA_H
#define _LISTA_H
#include <iostream>
#include "Carta.h"
namespace MS{
using std::ostream;
typedef Carta * T;
class Lista{
private:
struct Nodo{
T elem;
Nodo * next;
};
Nodo * t;
void Clear();
public:
Lista():t(0){}
bool Empty () const{return t==0;}
bool Full () const {return false;}
bool Push (const T &);
bool Pop (T &);
bool Top (T &)const;
void Print (ostream &)const;
virtual ~Lista (){Clear();}
};
}
#endif
File "Lista.cpp"
#include "Lista.h"
namespace MS{
bool Lista::Push (const T & E){
if(Full()) return false;
Nodo * q=new Nodo;
q->elem=E;
q->next=t;
t=q;
return true;
}
bool Lista::Pop (T & E){
if(Empty()) return false;
E=t->elem;
Nodo * temp = t;
t=t->next;
delete temp;
return true;
}
bool Lista::Top (T & E)const{
if(Empty()) return false;
E=t->elem;
return true;
}
void Lista::Print (ostream & out)const{
Nodo * temp=t;
while(temp){
out << *temp->elem << std::endl;
temp=temp->next;
}
}
void Lista::Clear () {
while (t){
Nodo * q=t;
t=t->next;
delete q;
}
}
}