链接列表复制构造函数和赋值操作符
linkList copy constructor and assignment operator
我正在编写我的节点和列表类,除了在列表类中包含析构函数,复制构造函数和赋值操作符函数外,一切都很好,我不知道它们有什么问题,也不知道我错过了什么。
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;
}
您的赋值应该类似于您的复制构造函数。因为它们的作用几乎是一样的。
区别在于你的分配应该 clear
在开始复制rhs(另一个)之前在列表(本身)中。
然后它应该返回对自身的引用。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;
}
你似乎有两个问题。首先,析构函数删除所有节点结构。一旦原始链表被销毁,使用复制构造函数复制的任何新链表都会有不正确的数据。其次,使用复制构造函数复制节点结构可能会更好。在没有确切信息的情况下很难说,但是您的链表函数可能看起来像:
firstNode = NULL;
nodeCount = 0;
node* temp = L.firstNode;
for(int i = 0; i < L.getNodeCount(); i++)
{
push_back(new node(*temp));
temp = temp->getNextNode();
}
这样新的链表就有了自己的节点副本。
相关文章:
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 错误的数组初始化与赋值副本构造函数初始化
- 赋值复制构造函数
- 复制构造函数,赋值操作符重载
- 通过调用Move赋值操作符实现Move构造函数
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 类赋值操作符和复制构造函数
- 影响正确性的move构造函数/赋值操作符示例
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 即使类没有定义构造函数,也不能在类上调用c++默认的move赋值操作符
- 复制构造函数和赋值操作符都被调用
- 与智能指针相关的c++移动语义与复制构造函数和赋值操作符
- 为什么不是只有一个?复制构造函数和赋值操作符
- c++析构函数、复制构造函数和赋值操作符实践考试
- 为什么这里需要构造函数和赋值操作符
- 赋值给构造函数中的常量变量
- 成员初始化列表vs赋值/复制构造函数(在boost deadline_timer中)
- 将传递的对象赋值给构造函数中的成员对象