我必须使用复制构造函数和复制赋值操作符来测试链表。
list1有3个双精度对象
list2 = list1,其中包含复制构造函数
List4 = list3 = list1是使用复制赋值操作符的地方。
则list4后面又加了1个double。
这是给我上的课。
// Specification file for the NumberList class
#ifndef NUMBERLIST_H
#define NUMBERLIST_H
class NumberList
{
private:
// Declare a structure for the list
struct ListNode
{
double value; // The value in this node
struct ListNode *next; // To point to the next node
};
ListNode *head; // List head pointer
public:
// Constructor
NumberList()
{ head = NULL; }
//TO DO: Add the copy constructor
NumberList(const NumberList& origObject);
//TO DO: Add the overloaded assignment operatora
NumberList& operator=(const NumberList& objToCopy);
// Destructor
~NumberList();
// Linked list operations
void appendNode(double);
void insertNode(double);
void displayList() const;
};
#endif
我有一个简单的复制构造函数,它做它必须做的事情。当我执行程序时,构造函数似乎做了它必须做的事情。我认为这是因为它只使用了一次复制构造函数。
NumberList::NumberList(const NumberList& origObject){
cout << "copy constructor called." << endl;
head = new ListNode;
*head = *(origObject.head);
}
这是复制赋值操作符
NumberList& NumberList::operator=(const NumberList& objToCopy){
cout << "overlaoded operator" << endl;
if(this != &objToCopy){
head = new ListNode;
ListNode* nodePtr = new ListNode;
nodePtr = objToCopy.head;
nodePtr->next = NULL;
ListNode* temp = objToCopy.head->next;
while(temp){
nodePtr->next = new ListNode;
nodePtr->next = temp;
nodePtr = nodePtr->next;
nodePtr->next = NULL;
temp = objToCopy.head->next;
}
}
return *this;
}
激活复制赋值后显示如下:list4=list3=list1
After inserting 5.5 to list4, List1 is:
1.6
After inserting 5.5 to list4, List3 is:
0
After inserting 5.5 to list4, List4 is:
0
5.5
是这样的。它应该看起来像使用了操作符后的样子。
After inserting 5.5 to list4, List1 is:
1.6
4.8
7.9
After inserting 5.5 to list4, List3 is:
1.6
4.8
7.9
After inserting 5.5 to list4, List4 is:
1.6
4.8
5.5
7.9
我觉得我想得越多,我就越不明白我写的代码。所以我基本上一直在写东西,希望它能起作用。
假设appendNode
已经过测试并正常工作,我建议对源列表进行简单的循环,然后在当前列表中调用appendNode
:
for (auto* node = objToCopy.head; node; node = node->next)
{
appendNode(node->value);
}
这一个循环将复制整个源列表。
记住先释放旧的列表。
为了使appendNode
更简单,更有效,并且当你想要附加一个节点时不必遍历整个列表,我建议你还存储一个指向列表尾部的指针。