Wpis z mikrobloga

Mam do zaimplementowania listę dwukierunkową:

List.h http://pastebin.com/KZB3PuRh

List.cpp http://pastebin.com/uctQcksu

Ale mam jedno polecenie, którego nie do końca rozumiem:

,,W klasie węzła jest destruktor, który sam >>naprawia<< powiązania listy powstałe po jego usunięciu (ma przecież wskaźniki na sąsiednie elementy), ale tylko w przypadku, gdy został wywołany dla elementu wewnątrz listy (nie pierwszego i nie ostatniego).''

Jak to interpretować? W klasie węzła mam zrobić prywatny destruktor i obudować go publiczną metodą np. ,,void request_delete()''? Wtedy miałbym kontrolę, kiedy ten destruktor jest wywoływany i mógłbym go nie wywoływać w przypadku pierwszego/ostatniego elementu? Czy jakoś źle to rozumiem i inaczej to trzeba zrobić?

#programowanie #cpp
  • 5
@Lempek: Masz taką listę:

1->2->3->4

Usuwasz element 3, zrobi się coś takiego:

1->2->_->4

Destruktor musi zadziałać tak, żeby było coś takiego:

1->2->4

Czyli musi przepisać adres wskaźnika next na adres elementu 4 i w elemencie 4 wskaźnik previous na adres elementu 2.

Przed usunięciem sprawdzasz, czy wskaźnik next lub previous usuwanego elementu nie wskazuje przypadkiem na nic, jak tak jest, to musisz podjąć odpowiednio inne kroki.
@Strus: No ok, wiem o co chodzi, tyle, że nie wiem jak zrobić, żeby destruktor węzła nie był wywoływany dla pierwszego i ostatniego elementu.

Na razie mam tak, że jak dla listy wywołam metodę do usuwania elementu, to ona sama naprawia połączenia, destruktora węzła nie ma:

http://pastebin.com/8i5Dfu4H

Teraz tak: muszę to naprawianie połączeń przenieść do węzła. Byłoby prosto, ale:

destruktor (węzła) ma być wywoływany ,,)tylko w przypadku, gdy został wywołany dla
@Lempek: Nie "destruktor ma być wywoływany", tylko destruktor ma naprawiać połączenie poprzedniego elementu z następnym, jak został wywołany przez element w środku listy. Nie da się "nie wywołać" destruktora przy niszczeniu obiektu.

Sprawdzasz więc po prostu w destruktorze czy next albo previous równe jest null (tylko pamiętaj, żeby je ustawiać na null w konstruktorze przy tworzeniu obiektu).