1. ホーム
  2. c++

[解決済み] C++でそれぞれ、ベクトル要素から引っ張ってくる

2022-03-01 16:43:09

質問

攻撃のベクトルに対して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();
    }
}

を使用する必要があります。 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 イテレータです。