84 votes

C++ pour chacun d'entre eux, à partir d'éléments vectoriels

J'essaie de faire un foreach sur un vecteur d'attaques, chaque attaque a un identifiant unique dire, 1-3.

La méthode de la classe prend en compte l'entrée clavier de 1-3.

J'essaie d'utiliser un foreach pour parcourir mes éléments dans m_attack pour voir si le nombre correspond, si c'est le cas... faire quelque chose.

Le problème que je rencontre est le suivant :

a'for each' statement cannot operate on an expression of type "std::vector<Attack

Est-ce que je me trompe complètement, j'ai de l'expérience en C# et c'est un peu 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();
        }
    }
}

192voto

Pour les prochains exemples, nous supposons que vous utilisez C++11. Exemple avec des boucles for basées sur le rang :

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 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 l'utilisation de std::for_each vous pouvez passer en boucle sur m_attack en utilisant des itérateurs :

for (auto attack = m_attack.begin(); attack != m_attack.end(); ++attack)
{  
    if (attack->m_num == input)
    {
        attack->makeDamage();
    }
}

Utilisation m_attack.cbegin() y m_attack.cend() pour obtenir const itérateurs.

28voto

juanchopanza Points 115680

C'est ainsi que l'on procède 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é (il peut s'agir de tout ce qui peut être appelé avec un Attack* comme argument).

12voto

Nikos Athanasiou Points 7015

En for each est prise en charge en tant qu'extension du langage natif c++ 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/cross platform 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. Il est donc préférable de les utiliser.

5voto

andre Points 3915

Le C++ n'a pas la 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X