我正在尝试对攻击媒介做一个预测,每次攻击都有一个唯一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();
}
}
}
答案 0 :(得分:117)
对于下一个示例,假设您使用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()
的行为。
您可以使用标准库+ lambdas中的std::for_each
:
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
迭代器。
答案 1 :(得分:19)
这是在C ++(11)循环中完成的:
for (const auto& attack : m_attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
C ++中没有for each
。另一种选择是使用std::for_each和一个合适的仿函数(这可以是任何可以用Attack*
作为参数调用的东西)。
答案 2 :(得分:9)
支持for each
语法作为Visual Studio中原生c ++的扩展。
#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
。
标准备选方案(在其余答案中提供)适用于所有地方。最好使用那些。
答案 3 :(得分:5)
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);