Salve a tutti!
Nello stesso progetto devo implementare il costruttore di assegnazione ed una funzione che, ricevuta una lista come argomento, elimini i valori comuni.
Questo è il codice della classe lista:
codice:
struct nodo
{
int valore;
nodo *succ;
};
class lista
{
nodo *l;
nodo* insert(nodo *p,int x);
bool find(nodo *, int);
nodo* split(nodo *l1);
nodo* Merge(nodo *l1, nodo *l2);
nodo* MergeSort(nodo *list);
public:
lista(){l=0;} // costruttore
~lista(); // distruttore
void push(int);
bool cancella(int);
void stampa();
bool trova(int);
void ordina();
lista(const lista &L); //Costruttore di copia OK
//lista operator= (const lista &L); //Costruttore di assegnazione
lista operator- (lista L); //Overloading
};
Questo è il codice del costruttore di assegnazione da me implementato:
codice:
lista lista::operator=(const lista &L){
nodo *p,*q,*r;
p=L.l;
l=0;
if (p==0)
cout<<"La lista è vuota";
else
while (p!=0){
q=new nodo;
if(l==0)
l=q;
else
q->valore=p->valore;
r->succ=p;
r=q;
p=p->succ;
}q=q->succ;
return *this;
}
Mentre questa è la funzione overload:
codice:
lista lista::operator-(lista L){
lista temp,nuova;
nodo *lp,*lc;
temp=*this;
lc=temp.l;
lp=L.l;
if(lc==0)
cout<<"Lista vuota";
else
while (lc!=0) {
nuova.push(lc->valore);
lc=lc->succ;
}
while (lp!=0){
if (nuova.trova(lp->valore)== true){
nuova.cancella(lp->valore);
lp=lp->succ;
}
else
lp=lp->succ;
}return nuova;
}
Ho provato ad effettuare le operazioni direttamente sulla lista temp=*this, anzichè copiare i valori in una nuova lista, ma il codice non funzionava. Ovvero non mi dava errori, ma quando chiamava la funzione mi restituiva valori anomali. (come return ho provato sia temp che this, ma niente da fare) Qualcuno sa spiegarmi il motivo??
Il problema è che implemento entrambe le funzioni il compilatori mi dice RUN FAILED, anche se non ci sono errori. Mentre se elimino il costruttore di assegnazione la funzione overload funziona. Come mai?
Nel main ho scritto:
codice:
nuova=esame.operator -(arg);
nuova.stampa();
Grazie!