如何检查派生类对象是否已存储在向量中?

时间:2017-10-12 00:00:30

标签: c++ object search vector polymorphism

我正在尝试为基于文本的游戏创建库存系统。我目前正在处理这样的函数,该函数将从名为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;
}

1 个答案:

答案 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()或使用该广告资源的代码,因此我们无法帮助您诊断该代码中可能出现的任何问题。