这是我昨天就单独链接列表分配的问题的后续跟进。我一直在努力创建复制构造函数,将赋值运算符留到最后,因为我认为它们与实现有些相似。我想我已经完成了创建复制构造函数的步骤:
请在任何步骤上纠正我(或者我需要扩展步骤)。我已经查看了很多在Google上发现的代码,试图理解我必须做的事情,但我的实现和理解仍然必须模糊。这是我的代码(未注释的代码是我的最后一次尝试。评论的代码是我之前尝试过的,希望到目前为止我至少在正确的轨道上):
template<typename T>
SLList<T>::SLList(const SLList<T> & lst2) : head() {
cout << "Calling copy constructor..." << endl;
for (Node *ptr = lst2.head; ptr != NULL; ptr = ptr->next) {
add(ptr->data);
}
}
编辑:感谢WhozCraig帮助我使用上面的复制构造函数。
以下是add
函数,以防万一可以使用:
template<typename T>
void SLList<T>::add(const T& val) {
Node *prev = head;
for (Node *ptr = head->next; ptr != NULL; ptr = ptr->next) {
prev = ptr;
if (ptr->data == val) {
return;
}
}
prev->next = new Node(val);
}
我的想法可能不对,但是我在lst2.add(ptr->data);
的第一个代码段的第5行会调用add
函数,只需用{{ptr->data
替换val
1}?只是想知道写这样的行是否会带来任何错误。
编辑:我也忘了发布此代码段。它向我展示了创建两个整数列表并尝试生成iList2 = iList;
以便调用复制构造函数。不过,我想我可能做错了。
void intList() {
SLList<int> iList;
cout << "\nNow showing integer list..." << endl;
iList.add(5);
iList.add(6);
iList.add(6);
iList.add(3);
iList.add(4);
SLList<int> iList2 = iList;
iList.print();
iList2.print();
}
编辑2:复制构造函数问题已在上面修复,但现在调用add
函数时,它会在for
循环中崩溃。可能是因为lst2
是const
个对象且add
不是const
函数,正如WhozCraig所说的那样?
编辑3:我尝试使用赋值运算符,以防万一:
template<typename T>
const SLList<T>& SLList<T>::operator=(const SLList & rhs) {
cout << "\nCalling assignment operator..." << endl;
// Step (1) Delete the existing list
while (head != NULL) {
Node *temp = head;
head = head->next;
delete temp;
}
// Step (2) Build a new, copy list
if (this != &rhs) {
for (const Node *ptr = rhs.head; ptr != NULL; ptr = ptr->next) {
add(ptr->data);
}
}
return *this;
}