Potrzebuję pomocy z destruktorem
Ostatnio zmodyfikowano 2011-04-16 06:30
waldiw Temat założony przez niniejszego użytkownika |
Potrzebuję pomocy z destruktorem » 2011-04-14 21:33:31 W poniższym programie mam problem z destruktorem. Wywołanie metody czysc elementy listy nie są usówane. Co jest tego przyczyną? Pętla czyszcząca wykonuje się, sprawdzałem to przez wyświetlanie napisu w tej pętli.
#include <conio.h> #include <iostream>
using namespace std;
struct element_listy { element_listy * nastepny, * poprzedni; int liczba; };
class list { public: list(); ~list(); void dodaj_element( int v ); void pokaz(); void czysc(); private: element_listy * poczatek, * koniec; };
list::list() { poczatek = koniec = NULL; cout << "KONSTRUKTOR: PUSTA LISTA UTWORZONA" << endl << endl; }
list::~list() { cout << endl << "DESTRUKTOR: LISTA ZNISZCZONA" << endl << endl; }
void list::pokaz() { element_listy * p; for( p = poczatek; p; p = p->nastepny ) { cout << " : "; cout << p->liczba << endl; } }
void list::czysc() { element_listy * p; while( koniec ) { p = koniec; koniec = p->poprzedni; delete p; } }
void list::dodaj_element( int v ) { element_listy * e = new element_listy; e->liczba = v; e->nastepny = NULL; e->poprzedni = koniec; if( koniec ) koniec->nastepny = e; koniec = e; if( !poczatek ) poczatek = e; }
int main() { list Lista1; Lista1.dodaj_element( 12 ); Lista1.dodaj_element( 10 ); Lista1.pokaz(); Lista1.czysc(); Lista1.pokaz(); system( "PAUSE" ); return 0; }
|
|
dmx81 |
» 2011-04-14 23:23:12 kolego, powiedz mi, w ktorym momencie wskaznik koniec jest rozny od NULL ?bo wg mnie on CIAGLE jest NULL, wiec dlatego nie wykonuje ci sie czyszczenie - jesli nie jest NULL - to czysc - tak ma byc, zgadza sie? ale ja nie zauwazylem, zebys "powiedzial" wskaznikowi w ktorymkolwiek momencie, aby on nie byl NULL. tzn jest jeden moment, ale tam chcesz przypisac mu wartosc, pod warunkiem, ze on nie jest NULL (a on jak na zlosc jest i nie przypisze sobie nic) byc moze cos przeoczylem, jak tak, to sie poprawie, tym czasem sprawdz to, co napisalem PS dopisze aby bylo bardziej czytelnie: poczatek = koniec = NULL; e->poprzedni = koniec;
if( koniec ) koniec->nastepny = e;
koniec = e; while( koniec ) { p = koniec; koniec = p->poprzedni; delete p; }
|
|
waldiw Temat założony przez niniejszego użytkownika |
» 2011-04-15 12:43:35 Dziękuję za wszystkie uwagi. Przy takim układzie funkcji dodaj_element dodanawanie działa prawidłowo. Widać to w działaniu programu. Do listy został dodany element o wartości 10 i kolejny o wartości 12. Pętla czyszcząca w funkcji czysc też przebiega 2 razy (czyli tyle, ile jest elementów). Po wstawieniu w pętlę funcji cout<< p->liczba wypisuje ona od tyłu elementy listy. Nie wiem, czemu nie działa w tej pętli funkcja delete. |
|
malan |
» 2011-04-15 22:31:10 A skąd wiesz, że nie działa? |
|
waldiw Temat założony przez niniejszego użytkownika |
» 2011-04-16 06:30:43 Po ponownym wywołaniu funkcji wyświetlającej elementy (po wykonaniu funkcji czyść) są one nadal wyświetlane, a gdyby zadziałało ich kasowanie, to nie powinny być wyświetlone. |
|
« 1 » |