C++ voor elk, trekkend uit vectorelementen

Ik probeer een foreach uit te voeren op een vector van aanvallen, elke aanval heeft een unieke IDzeg, 1-3.

De class-methode neemt de toetsenbordinvoer van 1-3.

Ik probeer een foreach te gebruiken om mijn elementen in m_attack te doorlopen om te zien of het nummer overeenkomt, als dat zo is… doe iets.

Het probleem dat ik zie is dit:

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

Ga ik hier helemaal verkeerd mee om, ik heb C#-ervaring en dit is een beetje waarop ik dit baseer, alle hulp wordt op prijs gesteld.

Mijn code is als volgt:

In kop

vector<Attack> m_attack;

In de klas

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

Antwoord 1, autoriteit 100%

Voor de volgende voorbeelden wordt ervan uitgegaan dat u C++11 gebruikt.
Voorbeeld met op range gebaseerde for-lussen:

for (auto &attack : m_attack) // access by reference to avoid copying
{  
    if (attack->m_num == input)
    {
        attack->makeDamage();
    }
}

U moet const auto &attackgebruiken, afhankelijk van het gedrag van makeDamage().

U kunt std::for_eachgebruiken uit de standaardbibliotheek + lambdas:

std::for_each(m_attack.begin(), m_attack.end(),
        [](Attack * attack)
        {
            if (attack->m_num == input)
            {
                attack->makeDamage();
            }
        }
);

Als u zich niet op uw gemak voelt bij het gebruik van std::for_each, kunt u m_attackherhalen met iterators:

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

Gebruik m_attack.cbegin()en m_attack.cend()om constiterators te krijgen.


Antwoord 2, autoriteit 15%

Dit is hoe het zou worden gedaan in een lus in C++(11):

  for (const auto& attack : m_attack)
    {  
        if (attack->m_num == input)
        {
            attack->makeDamage();
        }
    }

Er is geen for eachin C++. Een andere optie is om std::for_eachte gebruiken met een geschikte functor (dit kan alles dat kan worden aangeroepen met een Attack*als argument).


Antwoord 3, autoriteit 7%

De for each-syntaxis wordt ondersteund als een uitbreiding op native c++ in Visual Studio.

Het voorbeeld in 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;
}

(werkt in VS2013) is niet draagbaar/cross-platform, maar geeft u een idee van hoe u for eachkunt gebruiken.

De standaardalternatieven (vermeld in de rest van de antwoorden) zijn overal van toepassing. En die kun je het beste gebruiken.


Antwoord 4, autoriteit 3%

C++ heeft de lusfunctie for_eachniet in zijn syntaxis. Je moet c++11 gebruiken of de sjabloonfunctie std::for_eachgebruiken.

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

Other episodes