将向量内的Object属性与String进行比较

时间:2015-10-13 10:00:33

标签: c++ object vector find

我要做的是将向量中的对象数据成员与特定字符串匹配" HP Pot"如果匹配则返回true。 有问题的载体是一个可以服用MP药水和HP药水的背包。 魔药是一类。

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);
}

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

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

在这个定义中,我实现了find函数。

    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-&gt; getName()应该是指针类型。但当我将其更改为 hpPotion.getName()时,它告诉我对象正在使用与&#34; Potions :: getName()&#34不兼容的Oprator ; 方法

如果你们有另一种方法可以找出特定数据成员&#34; HP Pot&#34;对象药水等于&#34; HP Pot&#34;请告诉我。

2 个答案:

答案 0 :(得分:2)

您真的不想在这里使用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);
}

此外,使用字符串识别对象的类型并不是一个好主意,因为它非常容易出错。一个更好的解决方案是让Enum进入魔药类以识别药水的类型。或者,您可以为每种类型的药水创建从Potions类派生的类。

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

答案 1 :(得分:0)

忽略您发布的代码中的所有其他问题(例如=而不是!=,不知道getName()myString的返回类型等。),我认为运算符不兼容错误是由于==运算符与getName()myString的类型不兼容。关于这些类型的更多细节肯定会有所帮助。