gpt4 book ai didi

c++ - STL 列表 - 作为指针对象的数据类型

转载 作者:行者123 更新时间:2023-11-28 03:45:33 27 4
gpt4 key购买 nike

我在使用继承和 STL 列表库时遇到问题...

例如,我有一个带有两个派生类的抽象基类(其中定义了所有比较运算符)。该列表声明为

list<StoreItem*> items;

我正在插入一个名为 Food 或 Clothing 的派生类(属于抽象基类 StoreItem)。我制作了一个即将插入的新 StoreItem 指针:

StoreItem* item = new Food(arguments here);

现在,我想(按顺序)将这个新项目插入到列表中,我的尝试是这样的:

list<StoreItem*>::iterator iter;
for (iter = inventory.begin(); iter != inventory.end(); iter++)
{
if (*item < **iter)
break; // break out to insert
}

inventory.insert(iter, item);

我做错了什么吗?另外,我如何从库存中提取信息? (例如:使用复制构造函数的 Food tempFruit(**iter))。

提前致谢!祝你有美好的一天。

最佳答案

您假设从列表中拉出的项目是一个 Food 实例;然而,编译器并不知道这一点。当您从列表中的项目(具有明显类型 StoreItem 的项目)构建 Food 的新实例时,您正在尝试调用 Food::Food( const StoreItem) 或兼容的东西。为什么?因为迭代器指向 StoreItem*可能StoreItem 对象的实例,或者是从 派生的任何类的实例StoreItem,例如Food

正如其他发帖人评论的那样,多态性是成功的关键。您真的需要知道该项目是 Food 吗?如果不是,则访问所有商店项目共享的接口(interface)(如价格、序列号等)。如果您需要了解有关该项目的特定信息,那么您可以尝试推断其类型:

Food *food = dynamic_cast<Food*>(*iter);
if (food != NULL) {
// perform food related logic
std::cout << "Ingredients: " << food->ingredients() << std::endl;
}
else {
std::cout << "I can't eat that!" << std::endl;
}

关于c++ - STL 列表 - 作为指针对象的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816269/

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