复制具有两个链接列表的对象的构造函数C ++

时间:2018-11-07 04:56:09

标签: c++

我正在尝试为具有两个链接列表的对象创建副本构造函数。我想让我的副本知道对原始对象的引用。我写了一个复制构造器,可以复制原始文件,但仍引用原始文件,而我找不到它在哪里。这是我的代码。

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都包含一个布尔值和一个指向下一个节点的指针。

2 个答案:

答案 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引用获取其输入对象,这是一项要求。另外,它不会设置要复制到的对象的nonNegHeadernegHeader成员。它构造了要复制到的第三个对象,然后将其泄漏。

请尝试以下类似操作:

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
    }
}