Allora riscrivo in questa discussione per non aprirne una nuova.
Oggi ho rifatto un nuovo esercizio sempre di preparazione all'esame che dovrò dare tra poco, in questo caso il testo è il seguente:
http://it.tinypic.com/r/290sftu/8
in cui devo creare una lista per il noleggio di dvd, il mio codice come sempre è diviso in file.h e file.cpp, nel file.h metto la dichiarazione di classe mentro nel file.cpp vado proprio a scrivere le funzioni.
ecco i due file:
file.h
mentre questo è il file.cppcodice:#include <iostream> #include <cstring> using namespace std; struct elem { char titolo [36]; char cliente [21]; bool stato; // False: dvd presente , True: dvd noleggiato elem *pun; }; class NoleggioDVD { elem *testa; public: NoleggioDVD (); bool insDVD (const char *); bool noleggia (const char *,const char *); friend ostream& operator<<(ostream& , const NoleggioDVD& ); };
il main.cpp datomi dai professori è il seguente:codice:#include <iostream> #include "compito8.h" using namespace std; NoleggioDVD::NoleggioDVD () { testa=NULL; }; bool NoleggioDVD::insDVD (const char *s) { if (strlen(s)>35) return false; //inserimento in testa if (testa==NULL){ strcpy (testa->titolo, s); testa->stato=false; testa->pun=NULL; } //inserimento in coda else { elem *p=testa; while (p->pun!=NULL) p=p->pun; elem *r=new elem; p->pun=r; r->pun=NULL; r->stato=false; strcpy (r->titolo, s); } return true; } bool NoleggioDVD::noleggia (const char *s,const char *c) { //controllo if (strlen(s)>35 || strlen (c)>20 || testa==NULL) return false; //scorro la lista elem *p=testa; while (p!=NULL && !(strcmp(p->titolo, s)==0)) p=p->pun; //caso in cui non esista il dvd inserito o sia già noleggiato if (p==NULL || p->stato==true) return false; //il dvd esiste-->il cliente lo noleggia else { p->stato=true; strcpy(p->cliente, s); } return true; } ostream& operator<<(ostream& os, const NoleggioDVD& n) { elem *p; if (n.testa==NULL) os<<"Non ci sono DVD presenti in videoteca"; for (p=n.testa; p!=NULL; p=p->pun) { os<<p->titolo<<','; if (!p->stato) os<<"PRESENTE"; else { os<<"ASSENTE"<<'('<<p->cliente<<')'; } os<<endl; } }
la seconda arte è commentata perchè non ho scritto le funzioni riguardanti questa parte, comunque ora il mio problema è che quando vado a compilare il computer mi da errore di segmentazione, in questo modo: http://i62.tinypic.com/2s68od2.pngcodice:#include <iostream> #include "compito8.h" using namespace std; int main(){ // test prima parte NoleggioDVD n; n.insDVD("Madagascar 3"); n.insDVD("Sherlock Holmes - Gioco di ombre"); n.insDVD("Lo Hobbit"); n.insDVD("Django Unchained"); n.insDVD("Battleship"); cout<<n<<endl; n.noleggia("Lo Hobbit", "MARIO.ROSSI"); n.noleggia("Django Unchained", "LUIGI.BIANCHI"); n.noleggia("Madagascar 3", "GIOVANNI.VERDI"); cout<<n<<endl; /* // test seconda parte n.riconsegna("LUIGI.BIANCHI"); cout<<n<<endl; { NoleggioDVD n2(n); cout<<n2<<endl; } NoleggioDVD n3=!n; cout<<n3<<endl; */ return 0; }
in effetti devo dire che ogni volta che faccio un esercizio con puntatori mi da sempre questo errore, quindi è qualche sbaglio che faccio ripetutamente, potreste aiutarmi a capire quel'è tale sbaglio?
inoltre ho anche un'altra domanda da fare, infatti inizialmente avevo messo la struct all'interno della classe ma poi vedendo la soluzione del professore, ho notato che lui la mette fuori, così l'ho fatto anche io, ma che differenza ci sarebbe?
Grazie mille a tutti per le risposte! non immaginate quanto io sia grato dell'aiuto che mi state dando!

Rispondi quotando