2016-03-20 5 views
-1
class lista { 
class wezel { 
    wezel *nast; // next node in list 
    std::string napis; // string in node 
        // ... 
public: 
    void set_napis(string napis1) { napis = napis1; } 
    void set_nast(wezel *nast1) { nast = nast1; } 
    wezel(const std::string napis1, wezel *nast1) : napis(napis1), nast(nast1) {} 
    friend ostream& operator<< (ostream &wy, const wezel &wzl) { 
     if (wzl.nast) return wy << wzl.napis << ", " << *wzl.nast; 
     else return wy << wzl.napis; 
    } 

}; 
wezel *poczatek; // pointer to the beg of the list 
public: 
lista(); 
lista(const lista &lst); 
lista(lista &&lst); 
lista(initializer_list<std::string> lst); 
lista& operator= (const lista &lst); 
lista& operator= (lista &&lst); 
~lista(); 

public: 
friend ostream& operator<< (ostream &wy, const lista &lst) { 
    if (lst.poczatek) return wy << "(" << *lst.poczatek << ")"; 
    else return wy << "()"; 
} 

};Как сделать деструктор для класса в другой класс с указателями C++? Кое-что как одноклассный контейнерный класс и класс узлов

Я хочу написать деструктор, который удаляет не только член класса lista, но и wezel (все узлы) Указатель в wezel означает, что указатель на следующий элемент списка * nast. Если это nullpointer, это конец списка. Я знаю, что я не должен создавать деструкторы для строки, но как насчет этих указателей и т. Д.?

Большие извинения за мой английский. Я из Польши;) Greets;)

+0

Почему бы просто не использовать http://www.cplusplus.com/reference/list/list/ вместо того, чтобы изобретать колесо? –

+0

, потому что это наша задача от репетитора :) –

+0

Я вижу - вы хотите, чтобы мы записали вашу домашнюю работу. –

ответ

0

Проблема в том, что у вас нет контроля над тем, как были созданы wezel. Если они были созданы с new, штраф, всего delete их. Но если куча была создана с new[], то они должны быть уничтожены с помощью delete[], и если один только что был создан на стеке в главном (wezel wezel1("mystring");) его вообще не нужно удалять: он автоматически исчезнет в конце функции или блока, где он был объявлен.

TL/DR: если API явно не указано, что все wezel в listaсусло были созданы с new, вы не должны пытаться удалить их.

Или: вы должны использовать метод в lista, чтобы добавить новую строку и создать wezel в этом методе с помощью new. Таким образом вы контролируете, как оно было создано, и можете безопасно delete.