我正在编写我的节点和列表类,一切正常,除非我在列表类中包含析构函数,复制构造函数和赋值运算符函数,我不知道它们有什么问题或者我错过了什么不包括在内。
linklist::linklist()
:firstNode(NULL),
lastNode(NULL),
nodeCount(0) {}
linklist::~linklist()// destructor
{
node* current = firstNode;
while( current != 0 ) {
node* temp = current->getNextNode();
delete current;
current = temp;
}
firstNode = 0;
}
linklist::linklist(linklist &L)// copy constructor
{
firstNode = NULL;
nodeCount = 0;
node* temp = L.firstNode;
for(int i = 0; i < L.getNodeCount(); i++)
{
push_back(temp);
temp = temp->getNextNode();
}
}
linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator
{
linklist* LL;
node* temp = L.firstNode;
while( temp != NULL ) {
LL->getLast();
temp = temp -> getNextNode();
}
return *LL;
}
答案 0 :(得分:1)
您的作业应与您的复制构造函数类似。因为他们都做了几乎相同的事情。
在开始复制rhs(另一个)之前,您应该 clear
列表中的内容(本身)的差异。
然后它应该返回对自身的引用。 return *this
。这样就可以链接作业了。
linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator
{
// Check if self assignment
if (&L == this)
return *this;
// clear myself.
// copy other.
return *this;
}
答案 1 :(得分:0)
您似乎有两个问题。首先,析构函数删除所有节点结构。一旦原始文件被销毁,使用复制构造函数复制的任何新链接列表都将具有不正确的数据。其次,如果使用其复制构造函数复制节点结构,可能会更好。没有确切的信息很难说,但你的链表ctor可能看起来像:
firstNode = NULL;
nodeCount = 0;
node* temp = L.firstNode;
for(int i = 0; i < L.getNodeCount(); i++)
{
push_back(new node(*temp));
temp = temp->getNextNode();
}
这样,新的链表就有了自己的节点副本。