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

[C++] Lista jednokierunkowa szablonowa - destruktor.

Ostatnio zmodyfikowano 2015-05-22 16:41
Autor Wiadomość
mrsiekierka
Temat założony przez niniejszego użytkownika
[C++] Lista jednokierunkowa szablonowa - destruktor.
» 2015-05-20 22:36:44
Witam serdecznie. Piszę z problemem którego nie mogę rozwiązać samodzielnie. Posiadam klasę implementująca listę jednokierunkową szablonową, jednak nie wiem w jaki sposób napisać poprawnie destruktor i funkcje usuwające. Wiem, że było wiele razy, na Internecie jest wiele przykładów, ale jestem ciekaw, czy do mojej implementacji (która jest raczej poprawna) da się dopisać destruktor.

Problem polega na tym, że przy usuwaniu obiektu włącza się destruktor, który niczym kombajn kosi wszystko, całą listę. W takim razie w jaki sposób napisać destruktor poprawnie? Pozdrawiam

C/C++
#pragma once
#include "Zespolona.h"
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

template < class T >
class Lista
{
private:
    Lista * next;
    T wartosc;
    static Lista * glowa;
   
public:
    Lista();
    void Usun();
    void Usun2( Lista * );
    void Usun_wyb( int );
    int Dodaj( T wartosc );
    T Pobierz( int ktory );
    void Sortuj();
    int Ile();
   
    ~Lista();
};

C/C++
#include "Lista.h"

template < class T >
Lista < T >* Lista < T >::glowa = NULL;

template < class T >
Lista < T >::Lista()
{
}

template < class T >
void Lista < T >::Usun() // ktory element
{
    if( glowa == NULL ) cout << "Nie można wykonać operacji brak miejsca na stosie/problem z alokacją\n";
    else
    {
        Lista * tmp = glowa;
        glowa = glowa->next;
        delete tmp;
    }
}

//template <class T>
//void Lista<T>::Usun2(Lista *temp) // ktory element
//{
// if (temp == NULL) cout << "Nie można wykonać operacji brak miejsca na stosie/problem z alokacją\n";
// else
// {
// Lista *tmp = temp;
// temp = temp->next;
// delete tmp;
// }
//}

template < class T >
void Lista < T >::Usun_wyb( int wybor )
{
    Lista * tmp;
    Lista * tmp2;
    int licznik = 0;
    int licznik2 = 0;
    int licznik3 = 0;
   
    if( licznik == wybor ) Usun();
    else
    {
        tmp2 = glowa;
       
        for(; licznik != wybor; licznik++ )
        {
            tmp2 = tmp2->next;
        }
       
        tmp = glowa;
       
        for(; licznik2 != wybor - 1; licznik2++ )
        {
            tmp = tmp->next;
        }
       
        tmp->next = tmp2->next;
        delete tmp2;
        tmp2 = NULL;
    }
}

template < class T >
int Lista < T >::Dodaj( T wartosc )
{
    Lista * tmp;
    tmp = new Lista;
   
    if( tmp == NULL ) return 0;
    else
    {
        tmp->wartosc = wartosc;
        tmp->next = glowa;
        glowa = tmp;
       
        return 1;
    }
}

template < class T >
T Lista < T >::Pobierz( int ktory )
{
    Lista * tmp = glowa;
    int i = 0;
    while((( tmp != NULL ) && i < ktory ) )
    {
        i++;
        ( tmp ) =( tmp )->next;
    }
    if( tmp == NULL )
    {
        cout << "Koniec listy, ni ma juz nic, wybierz mniejsza liczbe" << endl;
        return NULL;
    }
    else return tmp->wartosc;
   
}

template < class T >
int Lista < T >::Ile()
{
    Lista * tmp = glowa;
    int i = 0;
    while( tmp != NULL )
    {
        i++;
        ( tmp ) =( tmp )->next;
    }
    return i;
}

template < class T >
Lista < T >::~Lista()
{
    while( glowa != NULL ) Usun();
   
}
P-132555
pekfos
» 2015-05-20 23:47:39
Problem polega na tym, że przy usuwaniu obiektu włącza się destruktor, który niczym kombajn kosi wszystko, całą listę. W takim razie w jaki sposób napisać destruktor poprawnie?
Jak w takim razie ma działać?
P-132556
mrsiekierka
Temat założony przez niniejszego użytkownika
» 2015-05-21 09:43:29
Zastanawiałem się, czy w destruktorze nie odpalać jakiejś metody sprzątającej całość, coś w stylu - usuń całą listę.No bo chodzi o to żeby przy usuwaniu jednego obiektu, elementu listy nie tracić jej całej
P-132560
Monika90
» 2015-05-21 10:32:39
Twoja klasa jest źle nazwana, bo to nie jest lista to jest element listy.
P-132562
pekfos
» 2015-05-21 10:39:23
No bo chodzi o to żeby przy usuwaniu jednego obiektu, elementu listy nie tracić jej całej
To wyzeruj wskaźniki na inne elementy listy.
P-132563
mrsiekierka
Temat założony przez niniejszego użytkownika
» 2015-05-21 12:18:50
Co do złej nazwy, to rzeczywiście może mieć to kluczowy wpływ na rozwiązanie mojego problemu.

Ale jeżeli wyzeruję te wskazniki, to jak pozniej mam im znowu adresy elementow przekazac?
P-132565
pekfos
» 2015-05-22 16:41:37
Ale jeżeli wyzeruję te wskazniki, to jak pozniej mam im znowu adresy elementow przekazac?
Po co? Przecież robisz to po to, by ten element usunąć. Co chcesz z nim potem robić, skoro go nie będzie..?
P-132621
« 1 »
  Strona 1 z 1