链接列表和复制构造函数

时间:2009-10-01 01:48:35

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

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

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

3 个答案:

答案 0 :(得分:3)

对于基本单链接列表类,我建议:

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

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


  

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果你有一个单链表:

A1 -> B1 -> C1

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

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

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

      A2
      |
      v
A1 -> B1 -> C1

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

BTW std :: list实现了一个双向链表并实现了深层复制语义。