gpt4 book ai didi

c++ - 是否可以在调用析构函数时将指向类实例的指针设置为 nullptr?

转载 作者:行者123 更新时间:2023-11-30 01:10:34 28 4
gpt4 key购买 nike

我正在尝试为类(class)项目创建链表。我的节点类有一个指向链接节点的指针和另一个指向专门书籍类的指针。

class Node{
private:
Book *data;
Node *linkedLink;
public:
Node(Book *inputedData);
Book* getBook();
Node* getLinked();
void changeLinked(Node *newLink);
Node& operator=( const Node& rhs );

~Node(); //deconstructor
};

我的教授提供了一个我们无法更改的驱动程序。在这个驱动中,他有如下代码:

// (bookList is an instance of my LinkedList class)
// (and getFirst() returns my LinkedList's head node)

while (bookList.getFirst() != nullptr)
{
Node * t = partsList.pop_front();
delete t;
}

以下是我的节点类析构函数:

Node::~Node(){
delete data; //this deletes the book class that data points to.
delete linkedLink;
}

问题是,在完成释放 *data*链接链接。但是我不能更改我的教授驱动程序,这意味着我必须在我的 Node 类析构函数中执行此操作。我对如何执行此操作感到困惑...我不必将 Node 类设置为 nullptr 以从我的教授驱动程序中跳出 while 循环吗?或者也许我完全偏离了轨道并且想得太多了。任何帮助将不胜感激。

=======[编辑]=======

我的 Node 类只能指向另一个 Node 类,不能再多了。它必须是“单链”列表,而不是“双链”。

=======[编辑 2.0]========

对于那些要求更多代码的人,以下是我的 LinkedList 类。

class List{
private:
Node* head;
Node* tail;
int count;
public:
List();
List(Node firstLink);

~List(); //deconstructor

Node* getFirst() const;
Node* getLast() const;

void push_back(Node *data);
void push_front(Node *data);

Node* pop_front();
Node* pop_back();

int getLength() const;
List& operator=(const List& that);
};

最佳答案

当对象被销毁时,C++ 语言中没有自动将某处指针设置为 null 的工具。如果某个指针需要在某处设置为 null,则析构函数负责实现它。据推测,您需要以某种方式实现某种功能来跟踪指向类实例的指针,然后在析构函数中将这些指针设置为空。

话虽如此,我确信您误解了您的作业。当类实例被销毁时,我认为没有必要将任何指针设置为 null。

在您教授的不可变驱动程序中,对 pop_front() 方法的调用将从其链表中完全删除该节点,并返回指向已删除节点的指针。您的 pop_front() 实现将从列表中完全删除节点,相应地更新所有列表指针,以指向列表中的剩余元素。

此时,除了从 pop_front() 返回的指针外,不应存在其他指向类实例的指针,然后该指针立即被 deleted .不会有任何指向您的类实例的指针需要设置为 null。

您教授的代码是 std::list 的经典实现,它管理完全相同的任务,而不需要 std::list 中任何类实例的析构函数来担心将任何指针设置为空。

关于c++ - 是否可以在调用析构函数时将指向类实例的指针设置为 nullptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37381955/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com