gpt4 book ai didi

c++ - 如何在 C++ 中返回一个列表

转载 作者:行者123 更新时间:2023-11-30 04:06:13 30 4
gpt4 key购买 nike

假设我有一个 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 并返回指向它的指针,则用户有责任在使用后删除此列表。

我不知道如何从这两个想法中做出选择,但我很确定有一些更好的方法可以解决这个问题。提前感谢您的建议。 :-)

最佳答案

添加复制构造函数和赋值运算符(并修复析构函数):

class List
{
private:
typedef struct node{
int data;
struct node* next;
}NODE;

NODE* head;
public:

virtual ~List() // Please fix this, as others have mentioned!
{ }
List(const List& rhs)
{
// this needs to be implemented
}
List& operator = (const List& rhs)
{
// this needs to be implemented
}
//...
};

“这需要实现”是您需要填写的内容才能使拷贝生效。

那么这给您带来了什么?首先,您现在可以按照您在问题中尝试做的形式编写函数。也就是说,您可以安全地按值返回一个列表,而无需执行任何进一步的编码来动态分配或删除列表。

List SumTwoList(List& list_1, List& list_2)
{
List list_3;
// do stuff to add data to list_3...
//...
//finally I want to return this list_3.
return list_3;
}

其次,假设我们要将一个列表复制到另一个列表。这可以使用“=”或通过简单的复制构造轻松完成

如果您不想复制,则通过将复制构造函数和赋值操作设为私有(private)且未实现*来关闭复制*,否则复制将成为使用您的类的程序员的一个选项,编译器也会在它执行时进行复制需要。

换句话说,如果复制正确实现,那么像这样的简单程序应该可以工作:

int main()
{
List lis1;
// Add some nodes to lis1...
//...
// Assume that lis1 now has nodes...complete the copying test
List lis2(lis1);
List lis3;
lis3 = lis1;
}

上面的程序应该没有内存泄漏,也没有崩溃,即使在 main() 返回时也是如此。如果不是,则复制和/或破坏被破坏。

*C++11 允许您通过在定义函数时使用 delete 关键字,以比使用 C++11 之前的代码更简单的方式禁用复制构造函数和赋值运算符。

关于c++ - 如何在 C++ 中返回一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993801/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com