我试图做的攻击向量的foreach,每次攻击都有一个唯一的ID说,1-3。
类方法需要1-3的键盘输入。
我试图使用foreach通过我在m_attack元素跑,看看是否匹配的数目,如果这样做......做一些事情。
我看到的问题是这样的:
a'for each' statement cannot operate on an expression of type "std::vector<Attack
我要对这个完全错误的,我有C#经验,是什么样的,我这个基础上,任何帮助,将不胜感激。
我的代码如下:
在头
vector<Attack> m_attack;
在班上
int Player::useAttack (int input)
{
for each (Attack* attack in m_attack) // Problem part
{
//Psuedo for following action
if (attack->m_num == input)
{
//For the found attack, do it's damage
attack->makeDamage();
}
}
}
对于接下来的例子假设你使用C ++ 11。 实施例与基于不等-for循环:
for (auto &attack : m_attack) // access by reference to avoid copying
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
您应该使用const auto &attack
取决于行为makeDamage()
您可以使用std::for_each
从标准库+ lambda表达式:
std::for_each(m_attack.begin(), m_attack.end(),
[](Attack * attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
);
如果您在使用不舒服std::for_each
,可以遍历m_attack
使用迭代器:
for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
使用m_attack.cbegin()
和m_attack.cend()
来获取const
迭代器。
这是怎么回事就在在C回路来完成++(11):
for (const auto& attack : m_attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
没有for each
在C ++中。 另一种选择是使用的std :: for_each的用合适的仿函数(这可能是任何可以与被称为Attack*
作为参数)。
的for each
语法被支持为在Visual Studio中的扩展,本地C ++。
在所提供的示例MSDN
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int total = 0;
vector<int> v(6);
v[0] = 10; v[1] = 20; v[2] = 30;
v[3] = 40; v[4] = 50; v[5] = 60;
for each(int i in v) {
total += i;
}
cout << total << endl;
}
(在VS2013的工作)是不可移植/跨平台的,但给你如何使用的想法for each
。
标准的替代品(在答案的其余部分提供)适用于任何地方。 这将是最好用的。
C ++不具备for_each
在语法循环功能。 你必须使用C ++ 11或使用该模板函数std::for_each
。
struct Function {
int input;
Function(int input): input(input) {}
void operator()(Attack& attack) {
if(attack->m_num == input) attack->makeDamage();
}
};
Function f(input);
std::for_each(m_attack.begin(), m_attack.end(), f);