我正在尝试为基于文本的游戏创建库存系统。我目前正在处理这样的函数,该函数将从名为Items的类派生的对象添加到向量,然后从派生类调用函数来更新其数量。我能够相当容易地做到这一点,但我想在函数中添加一些检查,因此它不会在向量中添加重复的对象,而是找到重复的对象并调用其更新其数量的函数。
我尝试过这样做,但是当程序被删除时程序会崩溃。所以我决定尝试删除删除并能够调用函数showInventory()并得到非常奇怪的结果。
我正在试图弄清楚如何检查类对象是否已经存储在向量中,如果它返回向量中的元素posistion,那么我可以使用对象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;
}
答案 0 :(得分:0)
您的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
向量仍在指向的对象。但是,您没有显示任何调用AddInv()
或使用该广告资源的代码,因此我们无法帮助您诊断该代码中可能出现的任何问题。