J'essaye de faire un foreach sur un vecteur d'attaques, chaque attaque a un ID unique disons, 1-3.
La méthode de classe prend la saisie au clavier de 1-3.
J'essaie d'utiliser un foreach pour parcourir mes éléments dans m_attack pour voir si le nombre correspond, s'il fait ... faire quelque chose.
Le problème que je vois est le suivant:
a'for each' statement cannot operate on an expression of type "std::vector<Attack
Suis-je totalement dans l'erreur, j'ai de l'expérience en C # et c'est en quelque sorte ce sur quoi je me base, toute aide serait appréciée.
Mon code est le suivant:
Dans l'en-tête
vector<Attack> m_attack;
En classe
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();
}
}
}
Pour les exemples suivants, supposons que vous utilisiez C++ 11. Exemple avec des boucles for à distance:
for (auto &attack : m_attack) // access by reference to avoid copying
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
Vous devez utiliser const auto &attack
en fonction du comportement de makeDamage()
.
Vous pouvez utiliser std::for_each
à partir de la bibliothèque standard + lambdas:
std::for_each(m_attack.begin(), m_attack.end(),
[](Attack * attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
);
Si vous n'êtes pas à l'aise avec std::for_each
, vous pouvez effectuer une boucle sur m_attack
à l'aide d'itérateurs:
for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
Utilisez m_attack.cbegin()
et m_attack.cend()
pour obtenir les itérateurs const
.
Voici comment cela se ferait dans une boucle en C++ (11):
for (const auto& attack : m_attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
Il n'y a pas de for each
en C++. Une autre option consiste à utiliser std :: for_each avec un foncteur approprié (tout ce qui peut être appelé avec un argument Attack*
]).
La syntaxe for each
est prise en charge en tant qu'extension du c ++ natif dans Visual Studio.
L'exemple fourni dans 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;
}
(fonctionne dans VS2013) n'est pas portable/multi-plateforme mais vous donne une idée de la façon d'utiliser for each
.
Les alternatives standard (fournies dans le reste des réponses) s'appliquent partout. Et il serait préférable d'utiliser ceux-ci.
C++ n'a pas la fonctionnalité de boucle for_each
dans sa syntaxe. Vous devez utiliser c ++ 11 ou utiliser la fonction template 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);