【发布时间】:2017-10-12 00:00:29
【问题描述】:
我正在尝试为基于文本的游戏创建库存系统。我目前正在研究将派生自名为 Items 的类的对象添加到向量的函数,然后从派生类调用函数以更新其数量。我可以很容易地做到这一点,但我想在函数中添加一些检查,这样它不会将重复对象添加到向量中,而是会找到重复对象并调用其函数来更新其数量。
我试过这样做,但是当程序被删除时,程序会崩溃。所以我决定尝试删除 delete 并且能够调用函数 showInventory() 并得到非常奇怪的结果。
我试图弄清楚如何检查一个类对象是否已经存储在一个向量中,以及它是否返回向量中的元素位置,以便我可以使用对象 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;
}
【问题讨论】:
-
您有一个指针向量,因此
std::find(inv.begin(), inv.end(), s)的默认行为将是比较指针。如果地址不同,则说明您没有相同的实例,无论指针处对象的内容多么相似,它们都不会匹配。这使得这个问题与std::find() on a vector of pointers 重复 -
调用
AddtoInv()的代码是什么样的? -
如果
inv已经包含四个指针并且s与第三个元素同名,请向您的橡皮鸭解释AddtoInv中会发生什么。 -
@RemyLebeau 用于一个案例,所以案例 1:inv.AddtoInv(new Grain) 它传入了 Items 类的子类。
-
在这样的函数参数中直接使用
new是不好的做法。如果AddtoInv()抛出异常(如inv.push_back()),那么您就会泄漏内存。在这种情况下,请考虑将std::unique_ptr<Items>用于AddtoInv()参数,将std::vector<std::unique_ptr<Items>>用于inv。这样一来,谁拥有什么就毫无疑问了。当inv被清除或销毁时,您可以自动销毁库存物品,因此您不必手动进行
标签: c++ object search vector polymorphism