好的,所以我是第一次尝试 C++,因为看起来我将不得不在即将到来的大学课程中使用它。我有几年的编程经验,但在非垃圾收集领域并不多。
我有一个类,一个用于双向链表的节点。所以基本上它有一个值和两个指向其他节点的指针。主构造函数看起来像Node(const std::string & val, Node * prev, Node * next)
. 该练习包括一个复制构造函数,该构造函数对另一个节点进行浅拷贝,并在其上方添加一条注释,说明将其更改为深拷贝。
这就是我认为的意思:
Node(const Node & other)
: value(other.value)
{
prev = new Node(other.prev->value, other.prev->prev, other.prev->next);
next = new Node(other.next->value, other.next->prev, other.next->next);
}
这似乎实现了使更改复制的节点不会影响新节点的目标。但是,当我这样做时,我在堆上分配新的东西。这让我很担心,因为我认为这意味着我也应该在节点的析构函数中删除它。但这现在与另一个构造函数不一致,其中指向节点的指针刚刚传入,已经指向某些东西。我不能在这种情况下正确地进入析delete
构函数,对吗?next
prev
我真的很困惑,感谢指导!
编辑:这是代码(在我上面的更改之前),根据要求:
#include <string>
//! Node implements a doubly-linked list node
class Node {
friend class LinkedList; //!< LinkedList can access private members of Node
public:
//! Constructor
Node(const std::string & v, Node * p, Node * n) :
value(v), prev(p), next(n)
{
}
//! Change to deep copy
Node(const Node & other) :
value(other.value), prev(other.prev), next(other.next)
{
}
//! Read-only public methods for use by clients of the LinkedList class
const std::string & GetValue() const
{
return value;
}
Node * GetPrevious()const
{
return prev;
}
Node * GetNext()const
{
return next;
}
//! Change to deep copy
Node & operator=(const Node & other)
{
if(this!=&other)
{
value=other.value;
prev=other.prev;
next=other.next;
}
return *this;
}
private:
std::string value; //!< value stored in the node
Node * prev; //!< pointer to previous node in the list
Node * next; //!< pointer to next node in the list
};