Destruktor listy

0

Witam, mam wręcz głupi problem... nie potrafię napisać destruktora listy dwukierunkowej.

waz::~waz() {
    czesc_weza *pom = glowa;
    czesc_weza *temp;
    while (pom) {
        temp = pom->nastepny;
        //delete pom; //zawiesza się na tym
        pom = temp;
    }
}

W innej części kodu mam problem z tym samym:

        czesc_weza *nowy = new czesc_weza(x, y);
        czesc_weza *pom = w->glowa;
        w->glowa = nowy; 
        w->glowa->nastepny = pom;
        pom->poprzedni = w->glowa;
        pom = w->ogon->poprzedni;
        //delete w->ogon; //zawiesza się 
        w->ogon = pom;
        w->ogon->nastepny = NULL;

W czym może być problem?

0
  1. Jeśli nie radzisz sobie z dwukierunkową listą, to napisz pierw jednokierunkową listę. Polecam skorzystać z http://gynvael.coldwind.pl/?id=441
  2. Stosuj odpowiednie nazewnictwo. Nie każda lista to wąż.
  3. W przypadku takiego kodu lepiej jest przedstawić całą treść klasy.
0
waz::~waz()
  {
   while(glowa)
     {
      czesc_weza *temp=glowa;
      glowa=temp->nastepny;
      delete temp;
     }
   //ogon=0; // dla clear() koniecznie dla destruktora nie
  }

Tak a propos nie potrzebujesz dwukierunkowej, tylko jednokierunkowej z tym że od ogona do głowy.

0

Program nadal się zawiesza. Wiem, że program nie jest optymalny, że popełniam mnóstwo błędów ale jestem początkujący i staram się jednak zrobisz to samemu -> choć początkowo myślałem, że w ogóle mi się to nie uda.

Dodam kody klasy:

class czesc_weza {
    private:
        int x, y;
        char dane;
        czesc_weza *nastepny;
        czesc_weza *poprzedni;
    public:
        czesc_weza (int, int);
        friend class waz;
        friend class mapa;
        ~czesc_weza();
};

class waz {
    private:
        czesc_weza *glowa;
        czesc_weza *ogon;
        short int dlugosc;
        bool top, left, bottom, right;
    public:
        waz (int, int);
        bool czy_to_waz (int, int);
        void sterowanie (int);
        friend class mapa;
        ~waz ();
};

Jeśli destruktory zakomentuje to wszystko działa -> tylko pamięć nie jest zwalniana.

0

Twój kod jest mało przejrzysty, ponieważ nie wiadomo za co konkretnie odpowiada każda ze stworzonych klas. Mieszasz zakres odpowiedzialności, a to bardzo zła praktyka. Spróbuj wzorować się na poniższym przykładzie:

#include <algorithm>
#include <vector>

enum Direction {
    Top,
    Bottom,
    Left,
    Right
};

struct Point {
  Point(int _x=0, int _y=0) : x(_x), y(_y) {}
  
  int x;
  int y;
};

class Snake {
public:
    Snake() : motion_direction(Left) {}
    
    bool is_body(const Point point) const { return std::find(body.begin(), body.end(), point) != body.end(); } 
   
private:
    Direction motion_direction;
    std::vector<Point> body;
};

Ten kod przede wszystkim lepiej się czyta, ponieważ implementacja kontenera nie została bezpośrednio wszyta w klasę Snake.

0

A powiedz mi co to:
~czesc_weza();
robi.
I po kiego istnieje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1