代码之家  ›  专栏  ›  技术社区  ›  AndyPerfect

在错误的对象上调用复制构造函数

  •  2
  • AndyPerfect  · 技术社区  · 14 年前

    我目前正在为链表类实现一个复制构造函数。当我用另一个链表作为参数创建一个类的新实例时,将为作为参数传递的对象调用构造函数。这让我感到难以置信的困惑。以下是理解main方法中发生的事情所必需的部分:

    int main()
    {
       LinkedList ll;
       LinkedList ll2(ll);
    }
    

    以下是LinkedList类的复制构造函数:

    LinkedList::LinkedList(const LinkedList & other)        
    {
       LLNode *otherCurNode = other.GetFirst();
       if (otherCurNode != NULL)
       {
          front = new LLNode(otherCurNode->GetValue(), NULL, NULL);
          back = front;
       }
       else
       {
          front = NULL;
          back = NULL;
       }
       LLNode *curNode = front;
       while (otherCurNode != NULL)
       {
          Insert(otherCurNode->GetValue(), curNode);
          curNode = curNode->GetNext();
          otherCurNode = otherCurNode->GetNext();
          back = curNode;
       }
       numNodes = other.GetSize();
    }   
    

    我道歉如果这是一个简单的问题-我对C++是相当新的。任何帮助都将不胜感激!

    3 回复  |  直到 14 年前
        1
  •  7
  •   John Kugelman Michael Hodel    14 年前
    LinkedList ll = LinkedList();
    

    这将创建一个链表实例,然后复制构造该实例。这看起来像Java或C#ism。实际上相当于:

    LinkedList ll(LinkedList());
    

    要创建空链表,只需编写:

    LinkedList ll;
    

    另外,请确保您有一个默认构造函数,可以正确地将链表初始化为空。如果没有,那么列表的变量将以堆栈上的垃圾值结束。

        2
  •  2
  •   casablanca    14 年前

    奇怪的事情往往是记忆处理不当的表现。我可以看到你发布的代码有一个直接的问题,其他函数也可能有类似的问题。

    在线上 while (otherCurNode->GetNext() != NULL) otherCurNode 已经是了 NULL otherCurNode = otherCurNode->GetNext(); . 你真的想成功吗 while (otherCurNode != NULL)

        3
  •  1
  •   Alex Emelianov    14 年前

    因此,不是调用ll2的复制构造函数,而是调用ll的复制构造函数,并将ll2设置为与ll相同的引用。

    你可以确保事情不是这样。你的 ll ll2 变量(顺便说一下,你可以看到为什么使用小写 l 简而言之,名称从来不是一个好主意)是在堆栈上分配的,它们不是引用。要查看这一点,请在两个变量都在作用域中时打开quickwatch,然后键入 &ll ,然后 &ll2

    您的默认构造函数和赋值运算符是什么样子的?还有其他的施工人员吗?你指定的其他地方吗 front