|
|
1
2
首先,我不确定该如何理解这个练习的目标。副本应该有多深?在像你这样的解决方案中,
也许是
但回到你的解释:
但是,同样,如果节点的复制构造函数复制整个列表,甚至只是复制它的几个节点,这将是非常意外的,而且人们总是会忘记清理所有这些副本。但这不是节点类的错误,而是练习要求。 |
|
|
2
2
通常,“深度复制”涉及遍历数据结构并复制整个内容。在您的情况下,给定一个节点,制作列表的完整副本。 |
|
|
3
2
深度副本生成结构的完整副本。我所说的结构是指一起工作以执行任务的对象的集合。如果您有一个car类,该类的每个车轮和车身都有一个对象,那么深度副本将生成整个汽车的副本(并同时生成车轮和车身的副本)。 在您的例子中,“整个结构”就是列表。深度复制操作只有在“列表级别”执行时才有意义。节点的深度复制会复制节点指向的数据,但不会将自身指定为列表的一部分(因为节点应该不知道“主”列表对象)。
注意:我只是把代码从我屁股里拔出来,所以它没有经过测试。但希望能有所帮助:) |
|
4
2
通过将指针传递到节点构造函数中,没有与指针一起传递的所有权相关的信息。这是一个糟糕的构造函数设计。您应该传入一个表示您不拥有下一个节点的引用,或者传入一个std::auto_ptr<&燃气轮机;这表明你必须拥有所有权。有人可能会认为next或prev可以为NULL(列表的开头或结尾),因此不能使用引用,但这可以通过使用替代构造函数来克服。
当然也有例外:
您没有提供的是析构函数的定义。有了它,我们就可以知道节点是否真正拥有传递给构造函数的指针(或者next和prev是否已经是智能指针)? |
|
|
5
1
如果每个节点都复制了它所指向的节点,则可以安全地删除析构函数中的对象。如果您正在传递指针(就像构造函数节点(const std::string&v,Node*p,Node*n))那样),那么您不“拥有”指针,也不应该删除它们。如果这是链表类的一部分,那么该类应该拥有指针,并根据需要删除对象。您还可以将节点设置为链表类的私有子类,以避免用户(或您自己)弄乱指针。 您在实现中的递归中也犯了一个错误,复制构造函数包含一个深度副本的级别,并调用“普通”构造函数,该构造函数接受指针,使其变浅。这意味着深度复制只有一级深度。它应该重复调用复制构造函数,如下所示:
好吧,在这里使用深度复制没有任何好处,但我能想到的唯一实际应用是复制整个列表,这可以在表示所述列表的类中更有效地处理。 |