Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Potrzebuję pomocy z destruktorem

Ostatnio zmodyfikowano 2011-04-16 06:30
Autor Wiadomość
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.
C/C++
#include <conio.h>
#include <iostream>

using namespace std;

// element listy
//--------------

struct element_listy
{
    element_listy * nastepny, * poprzedni;
    int liczba;
};

// klasa listy
//------------

class list
{
public:
    list(); // konstruktor
    ~list(); // destruktor
    void dodaj_element( int v );
    void pokaz();
    void czysc();
   
private:
    element_listy * poczatek, * koniec;
};

// funkcje składowe klasy list
//----------------------------

// konstruktor
//------------
list::list()
{
    poczatek = koniec = NULL;
    cout << "KONSTRUKTOR: PUSTA LISTA UTWORZONA" << endl << endl;
}

// destruktor
//-----------

list::~list()
{
    cout << endl << "DESTRUKTOR: LISTA ZNISZCZONA" << endl << endl;
}

// Wyświetla po kolei wszystkie elementy listy
// Zaznacza głowę i ogon listy
//--------------------------------------------

void list::pokaz()
{
    element_listy * p;
    for( p = poczatek; p; p = p->nastepny )
    {
        cout << "     : ";
        cout << p->liczba << endl;
    }
}

// Usuwa listę z pamięci
//----------------------

void list::czysc()
{
    element_listy * p;
   
    while( koniec ) // dopóki lista coś zawiera
    {
        p = koniec; // bierzemy ogon
        koniec = p->poprzedni; // jako ogon ustawiamy poprzednik
        delete p; // ogon usuwamy z pamięci
    }
}

// Wstawia v na koniec listy
//--------------------------

void list::dodaj_element( int v )
{
    // przygotowujemy element do wstawienia na listę
   
    element_listy * e = new element_listy; // tworzymy dynamicznie nowy element
    e->liczba = v; // umieszczamy w nim dane
    e->nastepny = NULL; // ogon nie posiada następnika
    e->poprzedni = koniec; // poprzednikiem jest obecny ogon
   
    // modyfikujemy listę, aby zawierała wstawiany element
   
    if( koniec ) koniec->nastepny = e; // dopisujemy element jako następnik ogona
   
    // modyfikujemy klasę po wstawieniu elementu
   
   
    koniec = e; // nowy ogon to dodany element
    if( !poczatek ) poczatek = e; // jeśli lista była pusta, to element jest również głową
   
}
///////////////////////////

int main()
{
    list Lista1; // tworzymy pustą listę
    Lista1.dodaj_element( 12 );
    Lista1.dodaj_element( 10 );
    Lista1.pokaz();
    Lista1.czysc();
    Lista1.pokaz();
   
    system( "PAUSE" );
    return 0;
}
P-30772
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:
C/C++
poczatek = koniec = NULL; //tu go ustawiasz na NULL - KONSTRUKTOR
e->poprzedni = koniec; //tu poprzedni ustawiasz wg koniec, czyli na NULL !!!!!!

if( koniec ) koniec->nastepny = e; //czyli if sie nie wykona!! funkcja DODAJ ELEMENT

koniec = e; // //no i koniec nie bedzie rowny e
while( koniec ) // czyli mowisz tu POMIN TA PETLE - funkcja CZYSC LISTE
{
    p = koniec;
    koniec = p->poprzedni;
    delete p;
}
P-30773
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.
P-30782
malan
» 2011-04-15 22:31:10
A skąd wiesz, że nie działa?
P-30851
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.
P-30868
« 1 »
  Strona 1 z 1