Problematica con lista linkata a puntatori e classe astratta

di Anonimizzato31015 il
5 risposte
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

  • Se non usassi una lista di puntatori, ti ritroveresti con delle copie di oggetti Carta nella lista. E ne faresti uscire un'ulteriore copia nel momento della Pop. Finché hai la solita lista di interi va bene, ma con degli oggetti non è più una soluzione efficiente.
    Inoltre, assegnando per copia oggetti ereditati da Carta a variabili di tipo Carta, causeresti una perdita di tutti i dati riguardanti la sottoclasse.
  • Quindi essenzialmente questa è la migliore soluzione che posso ottenre per fare una lista linkata a puntatori di tale oggetto?
  • Secondo me sì. Se vuoi usare classi polimorfiche, poi, mi sembra anche l'unica soluzione. Al limite potevi usare la classe std::list per evitare di implementarne una a mano.
  • Grazie mille!! Devo affrontare un esame e la prof vuole l ' implementazione della lista a mano
  • Ah credevo fosse un progetto tuo, buona fortuna
Devi accedere o registrarti per scrivere nel forum
5 risposte