c++ - 如何检查派生类对象是否已存储在 vector 中?

标签 c++ object search vector polymorphism

我正在尝试为基于文本的游戏创建库存系统。我目前正在研究将派生自名为 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/

相关文章:

PHP MySQL : Search query work only with existing full term

search - Vim - 在大括号内搜索

c++ - 超过 1 个字符串文字时的 QSqlQuery ctor 或 prepare() 语法

c++ - 是否可以使用指向成员的指针来获取实际指针?

c++ - 初始化引用值带有引用号的字段。参数: Is a copy made?

javascript - 将对象数组合并为一个对象数组

java - 二分查找函数未到达末尾

C++定义一个接受函数并将其传递给其他函数的宏,这可能吗?

javascript - 从对象内部获取对象的键

javascript - 仅当值为 true 时才返回对象键