C ++ Удалить объект из вектора? - PullRequest
0 голосов
/ 14 июля 2020

Я хотел бы удалить объект класса Attack из вектора под названием «movelist», который находится внутри класса игрока. Я попытался использовать этот и получил эту ошибку:

error: no match for 'operator==' (operand types are 'Attack' and 'const Attack')

Есть предложения?

void Player::del_attack(Attack a1)
{
   Attack to_rmv=a1;
   movelist.erase(std::remove(movelist.begin(), movelist.end(), to_rmv), movelist.end());
}

У меня есть

#include <algorithm>
#include <vector>

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Проблема в том, что вы не определили operator== для своего Attack класса. Если задуматься, это необходимо. Чтобы удалить элемент из вашего вектора, который равен to_rmv, алгоритм должен знать, как проверить, равны ли два объекта Attack.

Самый простой ответ - определить operator== для Attack, например:

// return true if x equals y, false otherwise
bool operator==(const Attack& x, const Attack& y)
{
    // your code goes here
}

Возможно, вам потребуется сделать этот оператор friend вашего класса Attack.

2 голосов
/ 14 июля 2020

std::remove() использует operator== для сравнения элементов со значением, которое вы хотите удалить. Если он не определен для вашего класса, вы должны ожидать появления такой ошибки.

Достаточно добавить такую ​​перегрузку в Attack. Например, используя простой struct для Attack:

struct Attack {
    int attackId;
    int strength;
};

bool operator==(Attack const& a, Attack const& b) {
   return a.attackId == b.attackId && 
          a.strength == b.strength; 
}

Пример в обозревателе компилятора: https://godbolt.org/z/8dhrab

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...