私は攻撃のベクトルでforeachを実行しようとしています。各攻撃には一意の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();
}
}
}
次の例では、C++ 11を使用することを想定しています。範囲ベースのforループの例:
for (auto &attack : m_attack) // access by reference to avoid copying
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
makeDamage()
の動作に応じて、const auto &attack
を使用する必要があります。
標準ライブラリ+ラムダの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
イテレータを取得します。
これは、C++(11)のループで行われる方法です。
for (const auto& attack : m_attack)
{
if (attack->m_num == input)
{
attack->makeDamage();
}
}
C++にはfor each
はありません。別のオプションは、適切なファンクターで std :: for_each を使用することです(これは、Attack*
を引数として呼び出すことができるものであれば何でもかまいません)。
for each
構文は、Visual Studioのネイティブc ++の拡張機能としてサポートされています。
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;
}
(VS2013で動作します)はポータブル/クロスプラットフォームではありませんが、for each
の使用方法のアイデアを提供します。
標準的な代替案(残りの回答で提供)はどこでも適用されます。そして、それらを使用するのが最善でしょう。
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);