Допустим ли вызов деструктора в данной ситуации?

141
02 июля 2019, 07:00

Пишу класс двусвязного списка, и у меня появилась необходимость перегрузить operator=. Кусок класса

    template<class T>
class List : public Collection<T> {
private:
    class Node {
    public:
        Node *_next;
        Node *_prev;
        T _data;
    };
    Node *_head;
    Node *_tail;
public:
    List() : _head(nullptr), _tail(nullptr) {}
    List(const T arr[]){
        for(const T &n: arr)
            this->push_back(n);
    }
    List(const List & copy): _head(nullptr), _tail(nullptr) {
        Node *temp = copy._head;
        while (temp != nullptr) {
            push_back(temp->_data);
            temp = temp->_next;
        }
    }
    ~List() {
        while (_head) {
            _tail = _head->_next;
            delete _head;
            _head = _tail;
        }
    }
    List<T> & operator=(const List & l){
        this->~List();
        Node *temp = l._head;
        while (temp != nullptr) {
            push_back(temp->_data);
            temp = temp->_next;
        }
        return *this;
    }
    void push_back(const T &data) {
        Node *newNode = new Node;
        newNode->_data = data;
        newNode->_next = nullptr;
        if (is_empty()) {
            newNode->_prev = nullptr;
            _head = _tail = newNode;
        } else {
            newNode->_prev = _tail;
            _tail->_next = newNode;
            _tail = newNode;
        }
    }
};

Как видите, тело метода скопировано из копирующего конструктора. Я не нашёл более простого способа замены списка (я же не могу вызвать копирующий конструктор над объектом this, а потом вернуть на него ук-ль?). Если подскажете как укоротить данный оператор (по возможности), я буду также благодарен?

Answer 1

Сделайте функцию swap, которая меняет местами два списка, вернее, их внутренности. Там всего-то

void List::swap(List& L)
{
    Node * tmp = _head; _head = L._head; L._head = tmp;
    // То же для _tail
}

Тогда ваш оператор присваивания легко выражается через копирующий конструктор:

List<T> & List::operator=(const List & l)
{
    List<T> tmp(l);
    swap(tmp);
    return *this;
}

Деструктор сам вызовется :)

READ ALSO
Обработка ошибки и передача через поток char

Обработка ошибки и передача через поток char

Функция конвертирует std::string в тип TПередача "-1" в числовые типы считается ошибкой

126
QProcess error QT c++

QProcess error QT c++

Всем приветЕсть вот такой код:

121
Не назначил что-то в функции

Не назначил что-то в функции

Не понимаю почему компилятор выдаёт, что я не назначил что-то в функцииОбъясните, как это делать правильно (уже который раз с этим сталкиваюсь)

123