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!