Хорошо, поэтому я впервые пробую 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
};