我正在尝试为具有两个链接列表的对象创建副本构造函数。我想让我的副本知道对原始对象的引用。我写了一个复制构造器,可以复制原始文件,但仍引用原始文件,而我找不到它在哪里。这是我的代码。
InfiniteBools::InfiniteBools(InfiniteBools* original) {
if (original == NULL) return;
//sets the head of copy to new linked list nodes that are copies of original
InfiniteBools* copy = new InfiniteBools();
copy->nonNegHeader = new LinkedListNode(original->nonNegHeader->value,NULL);
copy->negHeader = new LinkedListNode(original->negHeader->value, NULL);
LinkedListNode* tempPos = original->nonNegHeader;
LinkedListNode* tempNeg = original->negHeader;
LinkedListNode* copyTempPos = copy->nonNegHeader;
LinkedListNode* copyTempNeg = copy->negHeader;
tempPos = tempPos->next;
while (tempPos != NULL) {
// Allocate the next node and set current node next to the new node.
copyTempPos->next = new LinkedListNode(tempPos->value,NULL);
copyTempPos = copyTempNeg->next; //move temp to the new node
tempPos = tempPos->next; //move temp of original foward
}
tempNeg = tempNeg->next;
while (tempPos != NULL) {
copyTempNeg->next = new LinkedListNode(tempNeg->value, NULL);
copyTempNeg = copyTempNeg->next;
tempNeg = tempNeg->next;
}
}
我已经尝试过了,但是找不到哪里出了问题。如果您发现我做错了,请告诉我。
谢谢。
编辑:
InfiniteBools是一个对象,其中包含对两个节点的引用,这两个节点是两个链接列表的头部。 每个节点或LinkedListNode都包含一个布尔值和一个指向下一个节点的指针。
答案 0 :(得分:1)
首先:复制构造函数通常接受const引用:
InfiniteBools::InfiniteBools(InfiniteBools const& original);
然后您 已经在构造一个新对象。为什么第二个内部对象? this
是您的副本:
//InfiniteBools* copy = new InfiniteBools();
// would have resulted in a memory leak!!!
this->nonNegHeader = new LinkedListNode(original->nonNegHeader->value, nullptr);
this->negHeader = new LinkedListNode(original->negHeader->value, nullptr);
// prefer C++ keyword (nullptr) over (obsolete) C-style macro (NULL)
只要没有其他与您的成员同名的变量(前者然后隐藏后者),您就可以省略this->
。
您忘记检查original
的列表是否为空。
乍一看,其余的代码看起来是正确的(不过请注意,如果您有const引用,则需要const指针来遍历其列表节点!),没有明确进行测试。如果您不进行交错复制,则只需一组变量。如果您编写一个单独的类LinkedList
环绕节点,并在其自己的副本构造函数中进行复制,则可以避免代码重复。
实际上,已经有一个完全实现的链接列表:std::list
。它是双向链接的,如果您想要一个单链表,也有std::forward_list
。与重新发明轮子相比,您应该更喜欢现成的实现方式(除非您为 excersize ...这样做)。
答案 1 :(得分:1)
您显示的内容不是正确的副本构造函数。一方面,它不会通过const引用获取其输入对象,这是一项要求。另外,它不会设置要复制到的对象的nonNegHeader
和negHeader
成员。它构造了要复制到的第三个对象,然后将其泄漏。
请尝试以下类似操作:
InfiniteBools::InfiniteBools(const InfiniteBools& original)
: nonNegHeader(NULL), negHeader(NULL)
{
//sets the head of this to new linked list nodes that are copies of original
LinkedListNode* tempOrig = original.nonNegHeader;
LinkedListNode** tempCopy = &nonNegHeader;
while (tempOrig) {
// Allocate the next node and set current node next to the new node.
*tempCopy = new LinkedListNode(tempOrig->value, NULL);
tempCopy = &(tempCopy->next); //move temp to the new node
tempOrig = tempOrig->next; //move temp of original forward
}
tempOrig = original.negHeader;
tempCopy = &negHeader;
while (tempOrig) {
// Allocate the next node and set current node next to the new node.
*tempCopy = new LinkedListNode(tempOrig->value, NULL);
tempCopy = &(tempCopy->next); //move temp to the new node
tempOrig = tempOrig->next; //move temp of original forward
}
}