2013-02-22 6 views
31

私は攻撃のベクトルに対してforeachを実行しようとしていますが、それぞれの攻撃にはという一意のIDがあります。C++はそれぞれベクトル要素から引き出します

classメソッドは1-3のキーボード入力を受け取ります。

私はm_attackの要素を実行して番号が一致するかどうかを調べるためにforeachを使用しようとしています。

私が見ている問題はこれです:

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

関数[std :: for_each](http://www.cplusplus.com/reference/algorithm/for_each/) – andre

答えて

80

次の例では、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を取得しますイテレータ。

+1

ああ、それは私のヘッダーですそれを探して、私はそれのために図書館を狩っていた。ありがとう。 – Springfox

+0

その2番目のものは私が実際に後にしていることであり、もっと重要なのは私が理解していることです)。 ありがとうございました。 – Springfox

+0

@Justin Shrake:参照渡しがおそらく(常にそうとは限らないが)コピーによって渡されるのとは対照的に、ranged forループでは好ましいと説明することができます。 – DavidO

16

これは、それがCループで行われるであろう方法である++(11):次のように

私のコードである

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

はありませんC++の。もう一つの選択肢はstd::for_eachを適切なファンクタ(これは引数としてAttack*で呼び出すことができる何でもよい)で使用することです。

+0

['for each'](http://blogs.msdn.com/ b/arich/archive/2004/09/08/227139.aspx)は、VSのネイティブC++でサポートされている拡張機能です –

+0

+1 for C++ 11および自動 – sotrh

4

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

これは助けていただきありがとうございます。私はメソッドのintを返すようにする必要があります。 私は試してみましたが、リターンの正しい場所でポインタを参照する方法を理解できませんでした。それを助けるためにあなたの答えを編集する可能性がありますか? – Springfox

+0

@Springfox必要に応じて余分なメンバー変数を構造体に追加し、後でf.method(...)を使ってそれらにアクセスできます。 – andre

+0

なぜm_attackでstd :: begin/std :: endを使用しないのですか? – paulm

4

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を使用する方法のアイデアを提供します。

(他の回答に記載されている)標準的な選択肢はどこにでも適用されます。そして、それを使うのが最善でしょう。

関連する問題