web-dev-qa-db-fra.com

C ++ pour chacun, extrait d'éléments vectoriels

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();
        }
    }
}
52
Springfox

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.

124
user425495

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*]).

21
juanchopanza

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.

10

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);
5
andre