克里斯蒂娜
copyList
呼叫
copyList(otherList);
递归地,您将永远循环。
后退一步。您已经默认构造了
list1
和
list2
在里面
main()
创建的实例时
circularLinkedList<int>
. 所以当你打电话的时候
list2 = list1;
您正在调用
复制分配
成员函数。在当前代码中,复制分配只需调用
版权列表
(这本身很好)然而
版权列表
有点薄,不符合您的意愿,例如,仅包含:
template <class Type>
void circularLinkedList<Type>::copyList
(const circularLinkedList<Type>& otherList)
{
first = NULL;
copyList(otherList); /* what happens when you get here? */
// function to copy the list
}//end copyList
看到问题了吗?您调用
circularLinkedList<Type>::operator=
,它调用
circularLinkedList<Type>::copyList
然后递归地反复调用同一个函数。
(这是调试器中需要注意的地方--在点击
's'
(步进)英寸
版权列表
只有看到
first = NULL;
找到你的后背
版权列表
准备好执行
第一个=空;
再说一次,出了点问题……)
但是,总的来说,您在程序结构方面的思维是正确的,并且可以调用拷贝分配
版权列表
,您只需要实际复制列表。。。
那么该怎么办呢?您需要从
otherList
对新列表的引用。您可以轻松地遍历
其他列表
,就像你在
print()
正上方
版权列表
,除了输出每个值之外,您需要
insertNode
.
(事实上
打印()
您以开始迭代
first->link
而不是
first
对于循环列表来说有点奇怪,但是。。。这更像是一个命名问题,遍历工作正常)
横向移动
其他列表
和呼叫
插入节点(insertNode)
在您的
版权列表
将与中的遍历完全相同
打印()
. 它可以简单到:
template <class Type>
void circularLinkedList<Type>::copyList
(const circularLinkedList<Type>& otherList)
{
nodeType<Type> *iter = otherList.first->link;
while (iter != otherList.first) {
this->insertNode (iter->info);
iter = iter->link;
}
this->insertNode (iter->info);
} //end copyList
(您可以使用
current
而不是
iter
如果这对你更有意义,但我发现
iter
更详细地描述我对引用所做的操作,但这只是个人喜好)。
现在您的
复制分配
和
复制构造函数
应正常工作并正确调用。你不需要
testCopyConstructor
在所有
main()
. 要测试
复制分配
和
复制构造函数
,您可以简单地在main中添加另一个list实例,该实例将调用复制构造函数,而不是复制赋值,例如。
list2 = list1; /* copy assignment called */
cout << "List 2: ";
list2.print();
cout << endl;
cout << "Length List 2: " << list2.length() << endl;
cout << "List 1: ";
list1.print();
cout << endl;
circularLinkedList<int> list3 (list2); /* copy constructor called */
cout << "\nList 3: ";
list3.print();
cout << "\n";
使用/输出示例
总而言之,您应该能够按预期执行代码,例如:
$ ./bin/llcirmain
Enter number ending with -999
1 2 3 4 5 -999
List 1: 1 2 3 4 5
Length List 1: 5
Enter the number to be searched: 4
4 found in the list
Enter the number to be deleted: 3
After deleting the node, List 1: 1 2 4 5
Length List 1: 4
List 2: 1 2 4 5
Length List 2: 4
List 1: 1 2 4 5
List 3: 1 2 4 5
仔细检查一下,如果你还有其他问题,请告诉我。(并考虑删除
using namespace std;
在头文件中,您不希望在可能使用头文件的源文件中包含完整的标准命名空间)。