C++析构函数示例

Par*_*ara 0 c++ destructor linked-list

我的C++有点生疏但我已经制作了一个程序来反转链表,现在我正在尝试为它编写正确的析构函数,但我不知道究竟要销毁什么.这是我的类定义:

class LinkedList
{
    private:ListElement *start;
    public:LinkedList();
    public:void AddElement(int val);
    public:void PrintList();
    public:void InvertList();
};

class ListElement
{
    public:int value;
    public:ListElement * link;
    public:ListElement(int val);
    public:ListElement();
};


class Stack
{

private:ListElement ** stack;
private:int index;
public:Stack(int size);
public:void push(ListElement * le);
public:ListElement * pop();

};
Run Code Online (Sandbox Code Playgroud)

堆栈用于反转列表时.无论如何......我将如何为这些编写析构函数?我刚在想:

对于ListElement,使值为0,链接为0(NULL).

对于LinkedList,遍历元素并为所有元素调用ListElementDestructor.

我不是很确定这一点,因为我理解析构函数会自动调用成员对象的析构函数,所以在这种情况下只能为LinkedList写一个空的析构函数吗?我不知道......这就是我要问的原因

对于堆栈,我不知道......在反转列表之后,指针已经为0(NULL),因为它们都是poped.

我有点困惑.有人可以帮忙吗?先感谢您.

小智 9

你摧毁需要毁灭的东西.如果您的类使用new创建对象,则可能需要使用析构函数删除它们的析构函数.请注意,像LinkedList这样的容器应该只包含已动态分配的元素或不包含的元素.如果您将两者混合,或混合原件和副本,我怀疑您正在做,您可能需要使用智能指针或引用计数.

其次,如果你真的需要反转一个单链表(30年的编程,我从来不需要做),你只是使用错误的数据结构 - 你应该使用双链表,在这种情况下没有必要做任何事情.

第三,我可以说你的C++风格是非惯用的,对我来说几乎是不可读的 - 使C++看起来像Java并不是一个好主意.改成:

class LinkedList
{
    private:
       ListElement *start;
    public:
       LinkedList();
       void AddElement(int val);
       void PrintList();
       void InvertList();
};
Run Code Online (Sandbox Code Playgroud)