将向量中的对象 属性 与字符串进行比较

Compare an Object property inside a vector to a String

我想做的是将向量中的对象数据成员与特定字符串匹配 "HP Pot",如果匹配则 return 为真。 有问题的矢量是一个可以携带 MP 药水和 HP 药水的背包。 药水是 class.

vector<Potions> backpack;

Potions* hpPotion = new Potions("HP Pot", 5, 5);
Potions* mpPotion = new Potions("MP Pot", 5, 5);

for (int i = 0; i < 3; ++i)
{
    backpack.push_back(*hpPotion);
    backpack.push_back(*mpPotion);
}

我希望玩家(另一个 class)能够在 运行 玩家的战斗方法可用时使用药水。 战斗定义如下。

bool Player::attack(Monster& monster, vector<Potions> &backpack, Potions* hpPotion, Potions* mpPotion) 

在此定义中,我实现了查找功能。

    string myString = "HP Pot";
        if (backpack.empty())
        {
            cout << "No potions found!" << endl;
        }
        else if (find(backpack.begin(), backpack.end(), [myString](const Potions& hpPotion)
        {return hpPotion.getName() == myString; }) = backpack.end())
        {
            cout << "Hp potion found!" << endl;
        }

getName()方法定义如下。

string Potions::getName()
{
    return mName;   //Where mName is a private Data Member of Potions
}    

我得到的问题是 hpPotion->getName() 应该是指针类型。但是当我将它更改为 hpPotion.getName() 它告诉我对象正在使用与 "Potions::getName()"[ 不兼容的 Oprator =30=] 方法

如果你们有另一种方法来确定对象药水的特定数据成员 "HP Pot" 是否等于 "HP Pot",请告诉我。

忽略了您发布的代码中的所有其他问题(例如 = 而不是 !=,不知道 getName() 的 return 类型和 myString, etc.), 我认为operator not compatible错误是由于== operator not compatible with the types of getName() and myString.有关类型的更多详细信息肯定会有所帮助。

您真的不想在这里使用 findfind 的最后一个参数应该与迭代器返回的类型相同。因此,在您的情况下,最后一个参数应该是药水。您正在输入一个输出布尔值的 lambda 表达式。如果你想这样做,你应该使用 find_if。然而,一个更简单的解决方案是只创建一个函数来检查背包中是否有像这样的药水。

bool hasPotion(vector<Potions> & backPack, Potions & potion)
{
   for(auto iter = backPack.begin(); iter!= backPack.end(); ++iter)
   {
       if (iter->getName() == potion.getName())
           return true;
   }
   return false;
}

正如其他人所提到的,您的代码存在几个问题。我也会对其中的一些内容发表一些评论。

您正在分配和创建指向药水的指针。 vector::push_back 函数创建传递给它的对象的副本。将药水放入背包后,您有两个悬挂的指针需要清理。相反,您不妨正常创建药水,它们会自动清理。因此你会有

vector<Potions> backpack;

Potions hpPotion = Potions("HP Pot", 5, 5);
Potions mpPotion = Potions("MP Pot", 5, 5);

for (int i = 0; i < 3; ++i)
{
    backpack.push_back(hpPotion);
    backpack.push_back(mpPotion);
}

此外,使用字符串识别对象类型并不是一个好主意,因为它很容易出错。更好的解决方案是在 potion class 中使用 Enum 来识别药水的类型。或者,您可以为每种类型的药水创建 class 派生自 Potions class 的元素。

最后,虽然我不太了解您的设计,但我认为将生命药水和法力药水分别传入 attack 似乎很奇怪。您正在专门创建一种识别类型药水的方法。您可以简单地接受药水列表,甚至只是药水类型。