C++ +;=操作重载、自连接

C++ +;=操作重载、自连接,c++,C++,首先,请原谅,代码太长,是从code::blocks复制的,因此没有缩进,我使用了pastebin,这是类: 在这个类中,我有一个列表,+=运算符重载如下: List<T>& operator+= (List<T>& l) { List<T>* ptr; ptr=l.next; while(ptr!=&l) { this->push(*ptr->info); p

首先,请原谅,代码太长,是从code::blocks复制的,因此没有缩进,我使用了pastebin,这是类: 在这个类中,我有一个列表,+=运算符重载如下:

List<T>& operator+= (List<T>& l)
{
    List<T>* ptr;
    ptr=l.next;
    while(ptr!=&l)
    {
        this->push(*ptr->info);
        ptr=ptr->next;
    }
    return (*this);
}
List和operator+=(List和l)
{
列表*ptr;
ptr=l.next;
while(ptr!=&l)
{
此->推送(*ptr->信息);
ptr=ptr->next;
}
返回(*本条);
}
问题在于自连接,假设我有一个列表l1,这个列表中有一些值。如果我说:l1+=l1,试图编译一个程序,我看到程序进入无限循环。 我试图对此进行推理,因为参数是l1,通过引用调用,因此this==&l是有效的。 所以ptr指向l.next,也指向this->next。
我读取所有信息并将值推送到列表中,我不知道为什么它会进入无限循环,我不知道。

似乎您正在实现
列表,因此您可以访问其内部:只需在复制列表的过程中实现串联:

  • 复制作为参数传递的列表
  • 将副本的开头附加到当前列表的结尾
  • 从副本中删除列表,以避免移动节点的真实性

  • 从外观上看,你无法区分lust和它的节点:虽然这是可行的,但如果你有一个指向节点序列的列表句柄,通常效果会更好。

    使用调试器和单步执行。注意列表的大小。当列表的大小翻倍时,
    ptr
    的值是多少?列表中最初的最后一个节点的
    ptr->next
    发生了什么事?列表的大小增加了,如果我让它保持几秒钟,我会得到大约25000个大小。想想我的另外两个问题。是的,修改最后一个结束节点是避免问题的好方法。我可以复制,但是我不明白为什么它不起作用。另外,我知道我什么时候得到最后一个节点,因为这个节点信息是一个空指针。我曾想过使用一系列迭代器,例如for
    std::list
    ,但我怀疑这可能会有一个移动的结尾!也就是说,即使只获取一次
    end()
    迭代器,它也永远不会到达。每次附加节点时,列表都会变长一个元素。也就是说,当您将列表的第一个元素追加到它的末尾时,您仍然需要做与追加它之前一样多的工作。这永远不会改变,除非你知道哪一个是原始列表的结尾,停在那里。当您到达该元素时,该元素中的NULL早已消失。@DietmarKühl:非常确定您需要保存
    end()-1
    rbegin()