Problematica con lista linkata a puntatori e classe astratta

di il
5 risposte

Problematica con lista linkata a puntatori e classe astratta

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;
	}
}
	
	
	
	
	
}

5 Risposte

Devi accedere o registrarti per scrivere nel forum
5 risposte