C ++ двусвязный список: как показать, что Destructor реализован правильно - PullRequest
0 голосов
/ 06 мая 2018

По сути, я создал двусвязный список и теперь должен показать, что деструктор реализован и протестирован обратно в main.cpp (int main).

В назначении было предложено, чтобы я создал функцию, а также поместил оператор cout, который выводит адрес каждого узла непосредственно перед его удалением. Я не уверен, как мне это сделать.

Пока что я создал такую ​​функцию:

void cList() {
    DoublyLinkedList a
    cout << "ex: 0 1 2 3" << endl;
    for (unsigned i = 0; i < 4; i++) {
        a.push_back(i);
    }
    cout << "Display in function: ";
    a.display();
    cout << endl;

    //this shows the addresses of each node
    cout << "delete addresses: " << endl;
    for (it = del.begin(); it!=del.end(); ++it) {
        cout << &it << endl;
    }
}

Я понимаю, что когда список выходит из области видимости, вызывается деструктор. У меня есть заявление cout в ~ DoublyLinkedList, в котором написано «вызван деструктор». Когда я делаю это, оператор «деструктор называется» выводится после отображения адресов. Но как мне выполнить требование, отображая адрес до его удаления? Спасибо.

Пример вывода:

delete addresses:
0x7ffeb484d300
0x7ffeb484d300
0x7ffeb484d300
0x7ffeb484d300
Destructor Called

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы можете поместить эту часть в деструктор:

cout << "delete addresses: " << endl;
    for (it = del.begin(); it!=del.end(); ++it) {
        cout << &it << endl;
    }

, поэтому вывод удаленных узлов будет автоматически показан после завершения функции.

//This is assuming you aren't using any sentinel head/tail pointers.
~DoublyLinkedList() {
        cout << "delete addresses: " << endl;

        Node* nextNode = nullptr;

        while(headPtr) {
            nextNode = headPtr->next;
            cout << headPtr << endl;
            delete headPtr;
            headPtr = nextNode;
        }
        cout << "Destructor Called" << endl;
    }
0 голосов
/ 06 мая 2018

Ваш конструктор может выводить объект в том виде, в котором он был создан:

Node::Node()
{
    std::cout << "Creating node: " << this << std::endl;
}

тогда ваш деструктор может выводить противоположное, поскольку он уничтожен

Node::~Node()
{
    std::cout << "Destroying node: " << this << std::endl;
}

Тогда вам не нужно delete ничего в основном. Вам просто нужно убедиться, что ваш деструктор за DoublyLinkedList прошел и уничтожил все Node объекты. Затем, когда DoublyLinkedList a выпадет из области видимости, вы увидите выходную информацию деструкторов.

...