我正在尝试为基于文本的游戏创建库存系统。我目前正在研究将派生自名为 Items 的类的对象添加到 vector 的函数,然后调用派生类中的函数来更新其数量。我能够相当轻松地做到这一点,但我想在函数中添加一些检查,这样它就不会将重复对象添加到 vector 中,而是找到重复对象并调用其更新其数量的函数。
我试过这样做,但是当程序被删除时程序会崩溃。所以我决定尝试删除删除并能够调用函数 showInventory() 并得到非常奇怪的结果。
我试图弄清楚如何检查一个类对象是否已经存储在一个 vector 中,如果它返回 vector 中的元素位置,这样我就可以使用对象的 addQuant() 函数来更新它数量
std::vector<Items*> inv;
void Inventory::AddtoInv( Items* s)
{
if (!inv.empty())
{
for (int i = 0; i < inv.size(); i++)
{
if (inv[i]->getName() == s->getName())
{
inv[i]->addQuant();
delete s;
}
else
{
s->addQuant();
inv.push_back(s);
}
}
}
else{
s->addQuant();
inv.push_back(s);
}
}
void Inventory::ShowInv()
{
std::cout << "your inventory" << std::endl;
for (unsigned int i = 0;i < inv.size(); i++)
{
std::cout << i << ": " << inv[i]->getName() << " x" << inv[i]->showQuant() << std::endl;
}
}
我也试过了,但是 std::find() 没有找到对象。
if (std::find(inv.begin(), inv.end(), s) != inv.end())
{
std::cout << "you already have this item" << std::endl;
}
else
{
inv.push_back(s);
std::cout << "added item: " << s->getName << std::endl;
}
最佳答案
您的 AddtoInv()
函数可以简化为:
Items* Inventory::GetfromInv(const string &name)
{
for (int i = 0; i < inv.size(); ++i)
{
if (inv[i]->getName() == name)
return inv[i];
}
/* alternatively:
auto iter = std::find_if(inv.begin(), inv.end(), [&](Items *item){ return (item->getName() == name); });
if (iter != inv.end())
return *iter;
*/
return 0;
}
void Inventory::AddtoInv( Items* s)
{
Items *item = GetfromInv(s->getName());
if (!item)
{
inv.push_back(s);
item = s;
}
else
delete s;
item->addQuant();
}
话虽如此,delete
发生崩溃,showInv()
出现奇怪的结果,这意味着您没有正确管理您的指针。例如,如果您正在销毁 inv
vector 仍指向的对象。但是您没有显示调用 AddInv()
或以其他方式使用 list 的任何代码,因此我们无法帮助您诊断该代码中可能存在的任何问题。
关于c++ - 如何检查派生类对象是否已存储在 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46699314/