82

私は攻撃のベクトルに対してforeachを実行しようとしています。各攻撃には、1〜3などの一意のIDがあります。

classメソッドは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();
        }
    }
}
4

4 に答える 4

188

次の例では、C++11 を使用することを前提としています。範囲ベースの for ループの例:

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

const auto &attackの動作に応じて使用する必要がありmakeDamage()ます。

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

于 2013-02-22T15:38:29.587 に答える
26

これは、C++(11) のループで実行される方法です。

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

for eachC++ にはありません。もう 1 つのオプションは、std::for_eachAttack*を適切なファンクターと共に使用することです (これはas 引数で呼び出すことができるものであれば何でもかまいません)。

于 2013-02-22T15:19:32.190 に答える
5

for_eachC++ の構文にはループ機能がありません。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);
于 2013-02-22T15:30:20.090 に答える