链表-插入对象
c++ Linked List - Insert Object
我有一个通用的链表,与各种类型的数据,包括对象和指针对象等工作,但我有麻烦与列表工作时,我从一个类,从抽象类派生的插入对象。
我有一个抽象类vehicle和两个类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);
我有错误:
不能分配抽象类型'vehicle'的对象
编译器显示错误是在我的链表代码的insertEnd方法中,在我写的部分:
newNode->item = new Item;
这是一个项目的一部分,我需要有一个车辆列表,车辆可以是汽车,卡车等。我有一组车辆实现与指针到指针,但我正试图做到这一点与车辆列表。
你能帮我吗?
编辑:项目在我的链表中,我将显示我的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
是一个抽象类:它的复制构造函数不能用来创建一个功能完整的对象,因为它是抽象的。
这有点掩盖了这里真正发生的事情:你不能通过值传递对象并期望它们是多态的。如果没有看到此错误,可能会发生的情况是,您可能会对对象进行切片,这可能更不利于调试。按照@billz的建议,使用智能指针。
编辑:在看到您添加的insertEnd代码后,您通过引用传递,有一个附录:编译器不将调用insertEnd
中的复制构造函数。相反,您可能会在这一行看到错误:newNode->item = new Item
。在这里,您可以看到您正在尝试实例化抽象类的位置。将"Item
"替换为"vehicle
"——这就是你对模板所做的——你可以很清楚地看到它。
无论如何,按引用传递到解引用指针确实是一件非常痛苦且容易出错的事情。这很容易引入错误:如果在代码中的任何地方使用delete
v1,就像一个优秀的程序员所做的那样(优秀的程序员使用自动指针),那么您可能会让引用晃来晃去:指向内存中的某个空间,有朝一日——比如某个重要的人正在运行您的代码时——可能会在引用不知情的情况下被垃圾填充。这是通往疯狂之路,我的朋友。
这就是为什么智能指针是c++程序员最好的朋友:一旦你理解了它们在做什么,你几乎可以忽略这种混乱,只是通过值自由地传递它们。它们的生命周期契约定义得很好,它们自己清理,它们是异常安全的。只要你不设置引用周期——这在日常使用中比通过引用传递解引用指针的问题要少得多——或者尝试在标准容器中使用auto_ptr,你就大大减少了内存问题。
在这种情况下你需要使用指针,更好的方法是使用智能指针。
std::list<std::shared_ptr<vehicle> > lv;
在你的list<vehicle> lv;
, lv
只包含vehicle
类型的对象,lv.insertEnd(*v1);
将切片你的对象到车辆类型,这是不允许的,因为车辆是抽象类
由于不能实例化抽象类型的对象,因此无法构造插入对象。
同样,stl的复制构造语义不支持多态使用。"vehicle"列表应该只包含vehicle对象,而不是car对象。
必须使用指针容器。
- 尝试将对象插入空指针数组时出现分段错误
- 了解将对象插入矢量时的构造、复制和销毁
- 当类具有常量时,将对象插入到向量中
- 如何在声明时将对象插入 std::map
- 为什么我不能在 c++ 中将对象插入到地图中
- 使用带有比较结构的lower_bound将对象插入矢量
- 将没有默认 ctor 的对象插入到 std::map
- 如何将对象插入std::vector
- 将对象插入到具有动态内存(不允许向量)C++的数组中
- 将mpfr_t对象插入地图中的值
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- C++将带有构造函数的对象插入到映射中
- 将对象插入到列表中
- 如何将对象插入到集合中
- 如何将用户定义的对象插入 STL 集
- 将具有const字段的对象插入到容器中
- 如何将自定义对象插入到std::map中
- 如何将 Parent* 对象(指向 &Child 对象)插入到向量中<Child>?
- 如何将vector中包含的对象插入到集合中
- 将对象插入到C++序列列表中