大学の次のコースで C++ を使用する必要がありそうなので、初めて C++ を試してみます。私は数年間のプログラミング経験がありますが、ガベージ コレクションのない世界ではあまり経験がありません。
双方向リンク リストで使用するノードというクラスがあります。したがって、基本的には、値と他のノードへの 2 つのポインターがあります。メイン コンストラクタは次のようになり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
};