【发布时间】:2014-05-24 11:59:53
【问题描述】:
假设我有一个 List 类:
class List
{
private:
class Node{
public:
int data;
Node* next;
public:
virtual ~Node()
{
if (next != NULL)
delete next;
}
};
Node* head;
public:
virtual ~List()
{
if (head != NULL)
{
delete head;
}
}
public:
void AddNode(int data);
void DeleteNode(int data);
//....
};
现在我想实现一个函数,它将两个 List 引用作为参数并返回一个新创建的 List:
List SumTwoList(List& list_1, List& list_2)
{
//here I create a new List list_3 and add some elements to it based on list_1 and list_2(add operation use dynamic allocation).
//finally I want to return this list_3.
return list_3;
}
我在这里感到困惑。我应该如何在SumTwoList() 中创建这个list_3。如果我只是将其设为局部变量,则当函数返回时,list_3 的析构函数将释放所有添加到列表中的节点并销毁整个列表。但是,如果我做动态分配来创建这个list_3 并返回一个指向它的指针,使用后删除这个列表是用户的责任。
我不知道如何从这两个想法中进行选择,我很确定有一些更好的方法可以解决这个问题。提前感谢您的建议。 :-)
【问题讨论】:
-
您要退回一份副本。销毁的不是返回的副本。当然,这需要一个适当的复制构造函数,而不仅仅是浅拷贝指针。
-
@user3352668 - 您需要实现复制构造函数和赋值运算符。一旦你这样做并确认这两个函数可以工作,那么你的 sn-p 代码应该可以工作。顺便说一句,你的析构函数不起作用。
-
@chris 该副本是类 List 的副本,并非每个节点都与该列表相关联。两者的头指针会指向同一个节点。当一个被销毁时,它会删除列表中的所有节点,所以类List的新副本没有意义。
-
@user3352668,这就是为什么你应该有一个不会像克里斯提到的那样浅拷贝元素的复制构造函数
-
@adrin,如果 (N)RVO 不适用,这通常已经被 (N)RVO 和 C++11 中的移动语义覆盖。