Ho scritto una classe List (per distinguerla da list) che per ora ha solo le operazioni di pop e di push (proprio come se fosse una pila):
Length contiene la lunghezza della lista, non ho avuto problema con l' overloading dell' operatore <<.codice:#include <iostream> #include <cassert> using namespace std; template<class T> class List { public: List<T>(); ~List<T>(); protected: List<T> (T info); public: void push(T info); void pop(); friend ostream& operator<< (ostream& out, List<T> &l) { List<T>* ptr=l.next; while(ptr!=&l) { out << *(ptr->info) << "\t"; ptr=ptr->next; } return out; } friend List<T>& operator+= (List<T>& l1, List<T>& l2) { List<T>* temp=new List<T> (); List<T>* ptr; ptr=l1.next; while(ptr!=&l1) { temp->push(*(ptr->info)); ptr=ptr->next; } ptr=l2.next; while(ptr!=&l2) { temp->push(*(ptr->info)); ptr=ptr->next; } return *temp; } private: T *info; List <T>* next; List <T>* prev; int length; }; template <class T> List<T>::List () { info=NULL; next=this; prev=this; length=0; } template<class T> List<T>::List (T info) { next=this; prev=this; this->info=new T(); *(this->info)=info; } template<class T> List<T>::~List() { List<T>* ptr, * temp; ptr=this->next; if(this->info==NULL) { while(ptr!=this) { delete ptr->info; temp=ptr; ptr=ptr->next; delete temp; } } } template<class T> void List<T>::push(T info) { List<T>* ptr,*temp; temp=this->prev; ptr=new List<T>(info); temp->next=ptr; ptr->prev=temp; this->prev=ptr; ptr->next=this; length++; } template<class T> void List<T>::pop() { List<T>* ptr=this->prev->prev; assert(length>0); delete this->prev; ptr->next=this; this->prev=ptr; length--; } int main(int argc, char **argv) { List<int> *l=new List<int>(); List<int> *l2=new List<int>(); for(int i=0;i<10;i++) l->push(i); for(int i=10;i<20;i++) l2->push(i); *l+=*l2; cout<<*l<<endl; delete l; delete l2; return 0; }
Un problema che ho riscontrato è che sul libro che ho (il Deitel) mi fa l' esempio dell' overloading dell' operatore += passando come argomento solo un parametro, ma se provo a dargli un parametro mi dice che deve per forza avere 2 parametri.
Ma vengo al sodo: il problema è proprio nel main, quando provo a concatenare due liste (anche s enon mi da nessun errore ne warning):
Se provo a stampare l mi stampa solo i primi numeri da 0 a 9 anzichè da 0 a 19, in pratica non ha concatenato niente, l' operazione è "sterile".codice:int main(int argc, char **argv) { List<int> *l=new List<int>(); List<int> *l2=new List<int>(); for(int i=0;i<10;i++) l->push(i); for(int i=10;i<20;i++) l2->push(i); *l+=*l2; cout<<*l<<endl; delete l; delete l2; return 0; }
Penso che il problema sia provo quando faccio l' overloading:
Ma non riesco a capire cosa sbagliocodice:friend List<T>& operator+= (List<T>& l1, List<T>& l2) { List<T>* temp=new List<T> (); List<T>* ptr; ptr=l1.next; while(ptr!=&l1) { temp->push(*(ptr->info)); ptr=ptr->next; } ptr=l2.next; while(ptr!=&l2) { temp->push(*(ptr->info)); ptr=ptr->next; } return *temp; }![]()

Rispondi quotando
il metodo destroy è ricorsivo ma si ferma quando item->info è uguale a NULL, cioè quando incontra la sentinella.