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

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

有帮助吗?

解决方案

您可以做的不是复制 SGI的SLIST 的设计更糟糕 - SGI的模板库(“STL”)是为C ++标准库的一部分往往仍然是基础(技术上不正确;-)称为“STL”。不幸的是slist没有做它(它的双联表妹list OTOH没有做到,并成为std::list),但我不喜欢它。

如果你不希望模板的有效载荷类型和分配器,它的罚款硬编码他们,我猜;但关键点保留的是“节点”是一个内部实现细节 - 你只露出容器型,所有的漂亮的,典型方面(以及当然的有效载荷类型必须是已知的 - - 它的的硬模板吧,顺便说一句;-),你做(在您的class node;其中只包含一个class slist以及指向它)“节点”在你的.h不透明类<。 / p>

其他提示

为一个 基本的 单链表类,我推荐:

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

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


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

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

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

如果你有一个单向链表:

A1 -> B1 -> C1

和你写你自己的拷贝构造函数,反过来呼吁内部节点*成员的拷贝构造函数,那么你会得到:

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

你不应该做的是叫隐式生成的拷贝构造函数,这将不执行级联复制,你将得到的是:

      A2
      |
      v
A1 -> B1 -> C1

因此,要么编写自己的拷贝构造函数做了深刻的副本,或定义它实现无操作的私人拷贝构造函数。

顺便说一句在std ::列表实现双向链表并实现深层副本语义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top