【问题标题】:Linked list and copy constructor链表和复制构造函数
【发布时间】:2009-10-01 01:48:34
【问题描述】:

我正在尝试用 C++ 编写一个基本的单链表类。几年前我在我的数据结构课上做过,但我不记得细节了。

我的 Node 类应该有一个复制构造函数吗?它有一个 Node* 作为成员变量,据我所知,您总是应该为具有动态成员的类编写复制构造函数、析构函数和赋值运算符。但是从我在网上看到的情况来看,List 类负责节点的复制。真的是这样吗,如果是,为什么?

【问题讨论】:

    标签: c++ linked-list copy-constructor


    【解决方案1】:

    对于 basic 单链表类,我建议:

    • 分配每个节点后,分配后不要移动或复制节点
    • 因此,禁用 Node 类复制构造函数和赋值运算符

    如果您没有定义它们,C++ 会生成一个默认的复制构造函数和赋值运算符。我建议您禁用这些默认值,将它们声明为私有而不实现它们。


    但从我在网上看到的情况来看,List 类负责节点的复制。真的是这样吗,如果是,为什么?

    它负责复制节点,因为它支持复制(制作副本)整个列表(这意味着制作列表中每个节点的副本)。

    你不需要支持复制节点,除非你支持复制整个列表。

    【讨论】:

      【解决方案2】:

      你可能比复制sgi's slist 的设计更糟糕——sgi 的模板库(“stl”)是 C++ 标准库部分的基础,它通常仍然(在技术上不正确;-)称为“ stl”。不幸的是 slist 没有成功(它的双重链接表亲 list OTOH 成功了,并成为了 std::list)但我确实喜欢它。

      如果您不想对负载类型和分配器进行模板化,我猜可以对它们进行硬编码;但要保留的关键点是“节点”是一个内部实现细节——你只暴露 container 类型,具有所有好的、规范的方面(当然负载类型必须是已知的—— - 很难模板化它,顺便说一句;-),并且你在你的 .h 中使“节点”成为一个不透明的类(它只包含一个 class node;,并在你的 @987654326 中指向它的指针@)。

      【讨论】:

        【解决方案3】:

        如果你有一个单链表:

        A1 -> B1 -> C1
        

        并且您编写了自己的复制构造函数,然后调用内部 Node* 成员上的复制构造函数,然后您会得到:

        A1 -> B1 -> C1
        A2 -> B2 -> C2
        

        你不应该做的是调用隐式生成的复制构造函数,它不会执行级联复制,你会得到的是:

              A2
              |
              v
        A1 -> B1 -> C1
        

        因此,要么编写自己的复制构造函数来进行深度复制,要么定义一个私有的复制构造函数来实现无操作。

        顺便说一句,std::list 实现了双向链表并实现了深拷贝语义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-13
          • 2013-10-13
          • 2011-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多