gpt4 book ai didi

c++链表 - 插入对象

转载 作者:太空宇宙 更新时间:2023-11-04 15:06:20 24 4
gpt4 key购买 nike

我有一个通用链表,可以处理各种类型的数据,包括对象和指向对象的指针等,但是当我从派生自 的类中插入对象时,我无法使用该列表抽象类

我有一个名为 vehicle 的抽象类和 2 个 carr 和 truck 类,我可以这样做:

list<vehicle> lv;

vehicle * v1;
vehicle * v2;

v1 = new carr;
v2 = new truck;

cin >> *v1 >> *v2;

//But when I try to insert in the list

lv.insertEnd(*v1);

我有错误:

无法分配抽象类型“车辆”的对象

并且编译器显示错误出在我编写的部分链表代码的 insertEnd 方法中:

newNode->item = new Item;

这是一个项目的一部分,我需要有一个车辆列表,车辆可以是汽车、卡车等。我有一组车辆是用指向指针的指针实现的,但我正在尝试用一个车辆 list 。

你能帮帮我吗?

编辑:该项目在我的链接列表中,我将显示我的 insertEnd 方法:

template <class Item>
void list<Item>::insertEnd(const Item& item)
{
node<Item> *newNode= new node<Item>;

newNode->item = new Item;
*(newNode->item) = item;
newNode->next = 0;

if(head == 0)
{
head = newNode;
tail = newNode;
_size++;
}
else
{
novoNo->prev = tail;
tail->next = newNode;
tail = newNode;
_size++;
}
}

最佳答案

您正试图在您的链接列表中按值存储一个项目。按值使用项目会破坏多态性:只有指针或引用是多态的。

这是您看到的错误的原因是您在此处取消引用指针:lv.insertEnd(*v1) .以这种方式传递值将导致 C++ 为 insertEnd 中指定的类型使用 复制构造函数 使对象在你的 insertEnd 中函数(检查您的代码:insertEnd 的参数类型肯定是模板中指定的类型 - 这里是 vehicle)。通过按值传递,您是在告诉您的代码复制整个 v1。进入 insertEnd 内的新对象.这分崩离析,因为vehicle是一个抽象类:它的复制构造函数不能用于创建功能齐全的对象,因为它是抽象的。

这种情况掩盖了这里真正发生的事情:您不能按值传递对象并期望它们是多态的。如果您没有看到此错误,可能会发生的情况是您可能会 slice your object ,调试起来可能更糟。按照@billz 的建议进行操作并使用智能指针。

编辑:在看到您添加了 insertEnd 代码后,您在此处通过引用传递,有一个附录:编译器不会调用 insertEnd 中的复制构造函数| .相反,您可能会在此行看到错误:newNode->item = new Item .在这里您可以看到您尝试实例化抽象类的位置。替换单词 ' Item ' 与 ' vehicle ' - 这就是您使用模板所做的事情 - 您可以非常清楚地看到它。

在任何情况下,通过引用传递到解引用的指针确实是一件非常痛苦且容易出错的事情。引入错误太容易了:如果你 delete v1 在你代码的任何地方,就像一个优秀的程序员所做的那样(伟大的程序员使用自动指针),你可能会留下你的引用悬空:指向内存中的一个空间,有一天 - 比如当重要的人正在运行你的代码时 - 可能会充满没有你的引用知道它的垃圾。这是通往疯狂的道路,我的 friend 。

这正是智能指针是 C++ 程序员最好的 friend 的原因:一旦您了解它们在做什么,您几乎可以忽略这种困惑,只是将它们传递给值(value)自由。他们的生命周期契约定义得很好,他们自己清理,他们是异常安全的。只要您不设置引用循环——这在日常使用中比通过引用传递取消引用的指针问题要小得多——或 try to use auto_ptr in a standard container PLEASE READ THIS LINK AND UNDERSTAND IT ,您已经大大减少了内存问题。

关于c++链表 - 插入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188806/

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