Newsgroup: it.comp.lang.c++
Titolo: overload operatore e costruttore

nel main ho fatto una funzione che dovrebbe richiamare il costruttore di
copia tramite l'overload dell'operatore di assegnazione:
void copia (const lista& l){
  lista a = l; //l è la lista originaria
}
nella classe ho aggiunto:
lista(){ l=0;}
lista& operator = (const lista& lis) {
    lista l(lis);
    return l;
}
nel file che implementa le funzioni:
lista::lista( const lista& a) {
 l = 0;
 *this = a;
}
lista& operator=(lista& a) {
 if (this == &a) // evita la copia su se stesso
  L q = l.l;   //Creiamo un puntatore d'appoggio
       if (q!=0){        //Testiamo se la lista da copiare è vuota
             l = new Record;   //Allochiamo una nuova struct
             l->elem=q->elem;   //Copiamo i campi
             L t = l;
             q=q->punt;  //Avanziamo col punt. nella lista da copiare
             while(q!=0){  //Cicliamo fino a che non termina la lista
                 l->punt = new Record; //Accodiamo nuove struct
                 l = l->punt;
                 l->elem = q->elem;
                 q=q->punt;
             }
             l->punt=0; //Poniamo il campo punt dell'ultima struct a zero
       }
       else cout<<"Lista Vuota";
return *this;
}
Purtroppo ci sono 12 errori...:
RIGA: ERRORE:
lista(const lista& a): parse error before `const'
lista& operator=(lista& a) {: operator =(lista &)' must be a nonstatic
member function
if (this == &a): invalid use of `this' in non-member function
L q = l.l: `l' undeclared (first use this function)
if (q!=0): `q' undeclared (first use this function)
gli ultimi 2 errori non li capisco proprio...eppure ho definito il typedef L
di tipo Record*...
typedef int E;
struct Record{
       E elem;
       Record* punt;
       };
typedef Record* L;
ciao!

Beh se proprio vuoi essere aiutato, devi scrivere del codice più chiaro e
indicare con precisione che cosa vuoi risolvere, perchè così, mi dispiace,
ma non si capisce molto.
--------------------------------
Inviato via 
http://usenet.libero.it


ok, ora posto i tre file del progetto, cmq ricevo l'errore
25 listaclasse.cpp
 `operator =(const lista &)' must be a nonstatic member function
alla riga:
lista::lista& operator = (const lista& lis) {
    lista l(lis); //QUI!!!
    return l;
}
***listaclasse.h:
#ifndef LISTACLASSE_H
#define LISTACLASSE_H
typedef int E;
struct Record{
       E elem;
       Record* punt;
       };
typedef Record* L;
class lista{
      private:
      L l;
      void inserisciric(L& l, E e);
      void eliminaric(L& l, E e);
      void elimina_testa(L& l);
      public:
      lista(){ l=0;}
      lista(const lista& lista);
      lista& operator=(const lista& r);
      ~lista();
      void push(E e);
      void pop(E e);
      void inserisci(E e){ inserisciric(l,e);}
      void elimina(E e){ inserisciric(l,e);}
      bool empty(){ return (l==0);}
      void top(E e);
      };
#endif
***listaclasse.cpp:
#include <iostream>
#include "listaClasse.h"
lista::lista(const lista& lista) {
  L q = lista.l;   //Creiamo un puntatore d'appoggio
       if (q!=0){        //Testiamo se la lista da copiare è vuota
             l = new Record;   //Allochiamo una nuova struct
             l->elem=q->elem;   //Copiamo i campi
             q=q->punt;  //Avanziamo col punt. nella lista da copiare
             while(q!=0){  //Cicliamo fino a che non termina la lista
                 l->punt = new Record; //Accodiamo nuove struct
                 l = l->punt;
                 l->elem = q->elem;
                 q=q->punt;
             }
             l->punt=0; //Poniamo il campo punt dell'ultima struct a zero
       }
       else cout<<"Lista Vuota";
}
lista::lista& operator = (const lista& lis) {
    lista l(lis);
    return l;
}
lista::~lista(){
           L q,p;
           for (p=l; p!=0; p=q){
               q=p->punt;
               delete p;
              }
}
void lista::inserisciric(L& l, E e){
     if ((l==0) || (e<l->elem))
     push(e);
     else inserisciric (l->punt, e);
}
void lista::eliminaric(L& l, E e){
     if (l!=0){
        if(e==l->elem) elimina_testa(l);
        else eliminaric(l->punt,e);
     }
}
void lista::elimina_testa(L& l){
     L ltemp=l->punt;
     delete l;
     l=ltemp;
}
void lista::push(E e){
     L q=new Record;
     q->elem=e;
     q->punt=l;
     l=q;
}
void lista::pop(E e){
     if (l!=0){
        e=l->elem;
        L q=l;
        l=l->punt;
        delete q;
        }
     else cout<<"Operazione impossibile, lista vuota!";
}
void lista::top(E e){
     if(l!=0) e=l->elem;
       else cout<<"Lista vuota per richiesta top!";
}
***usalistaordclasse.cpp:
#include <stdio.h>
#include <string>
#include <stdio.h>
#include "listaClasse.h"
void presenta_menu(int& scelta);
void inserimento (lista& l);
void cancellazione (lista& l);
void estrazione (lista& l);
void analisi (lista& l);
void copia (const lista& l);
int main(int argc, char *argv[])
{
  lista l;
  E e;
  int scelta;
  do{
     presenta_menu(scelta);
     switch(scelta){
        case 1: inserimento(l); break;
        case 2: cancellazione(l);break;
        case 3: estrazione(l);break;
        case 4: analisi(l);break;
        case 5: copia(l);break;
     }
  }while (scelta!=6);
  return 0;
}
void presenta_menu(int& scelta){
   do{ system("cls");
     cout<<"1)inserimento elemento"<<endl;
     cout<<"2)cancellazione elemento"<<endl;
     cout<<"3)estrazione in testa"<<endl;
     cout<<"4)Analisi Elemento affiorante"<<endl;
     cout<<"5)Copia lista"<<endl;
     cout<<"6)Esci"<<endl;
     cout<<"Inserire Opzione:";
     cin>>scelta;
     if ((scelta>6) || (scelta<1))
     {cout<<"Opzione non in elenco! Riprova";
     getchar(); }
   }while ((scelta<1) && (scelta>6));
}
void inserimento (lista& l){
     E e;
     cout<<endl;
     cout<<"1)Inserimento di un elemento"<<endl;
     cout<<"Elemento:";
     cin>>e;
     l.inserisci(e);
}
void cancellazione (lista& l){
     E e;
     cout<<endl;
     cout<<"2)Cancellazione di un elemento"<<endl;
     if (!l.empty()){
     cout<<"Elemento:";
     cin>>e;
     l.elimina(e);}
     else {cout<<"Lista vuota, operazione impossibile!";
     getchar();}
}
void estrazione(lista& l){
     E e;
     if(!l.empty()){
     l.pop(e);
     cout<<"Elemento Eliminato!";
     getchar();
     }else cout<<"Lista vuota!";
     getchar();
}
void copia (const lista& l){
  lista lis=l;
}
void analisi (lista& l){
     E e;
     if (!l.empty()){
        cout<<endl;
        cout<<"4)Analisi Elemento affiorante" << endl;
        l.top(e);
        cout<<"Elemento:"<< e;
        getchar();}
     else {cout<<"Lista vuota!";
     getchar();}
}

 return l;
Qui l'errore è palese!!!!
che significa lista l(lis);???
l è un del tipo struct Record *;
lista è una funzione che prende un parametro!
COSA INTENDEVI FARE QUI?


 COSA INTENDEVI FARE QUI?
purtroppo questo costruttore di copia mi sta facendo impazzire :-(( quella
funzione mi era stata consigliata da un amico...
ho provato a fare:
lista::lista& operator = (const lista& lis) {
    lista(lis);
    return l;
}
ma ottengo 4 errori:
25 listaclasse.cpp
 `operator =(const lista &)' must be a nonstatic member function
26 listaclasse.cpp
 declaration of `lis' shadows a parameter
27 listaclasse.cpp
 `l' undeclared (first use this function)
ciao

 }
Qui è sintatticamente corretta la chiamata a funzione, però l'intestazione
dell'overloading non è corretta!!
dovrebbe essere come la dichiarazione di ogni funzione membro:
--> lista& lista::operator = (const lista& lis) {
       ...


     }
ora mi da 2 errori:
lista& lista::operator = (const lista& lis) {
    lista(lis);//errore 1
    return l;// errore 2
}
26 listaclasse.cpp
 declaration of `lis' shadows a parameter
27 listaclasse.cpp
 conversion from `Record *' to non-scalar type `lista' requested
fammi sapere
ciao