无法从向量中删除元素,试图引用已删除的函数

问题描述 投票:-1回答:1

我正在使用SFML库在C ++中制作“太空入侵者”的“版本”,但是当我尝试删除入侵者时遇到问题。我的代码中出现此错误:

Enemy &Enemy::operator =(const Enemy &)': attempting to reference a deleted function

我尝试检查此论坛中推荐的其他解决方案,但我不理解它们,或者情况不同。

EnemyControler.cpp

EnemyControler::EnemyControler()
{
    Enemy::Type types[] = {
        Enemy::Type::Squid, Enemy::Type::Crab, Enemy::Type::Crab,
        Enemy::Type::Octopus, Enemy::Type::Octopus
    };


    for (int y = 0; y < 5; y++) { // Add enemies to the vector
        for (int x = 0; x < 11; x++){
            float enemyX = x * 40 + (gapBetweenEnemies * x * 3) + Enemy::enemyWidth; // Make horizontal gap between them
            float enemyY = y * 40 + (gapBetweenEnemies * y) + Enemy::enemyHeight; // Make vertical gap between them
            enemies.emplace_back(sf::Vector2f{ enemyX, enemyY }, types[y]); // Add them to the vector
        }
    }
}
void EnemyControler::destroyEnemy()
{
    for (auto iterator = begin(enemies); iterator != end(enemies);) {
        auto& enemy = *iterator;
        if (enemy.isAlive()) {
            iterator++;
        }
        else {
            iterator = enemies.erase(iterator);
        }
    }
}

问题出在destroyEnemy函数中。具体在iterator = enemies.erase(iterator);

EnemyControler.h

class EnemyControler
{
public:
    EnemyControler();

    void destroyEnemy();
private:
    const int gapBetweenEnemies = 10;

    std::vector<Enemy> enemies;
};

如果没有解决此问题的简便方法,或者只能通过重写所有代码来解决此问题,也许您可​​以建议从向量中删除入侵者的另一种方法。

c++ sfml 2d-games
1个回答
0
投票

[如果类具有const成员变量,则编译器将默认删除该类operator=的副本分配运算符。

来自https://en.cppreference.com/w/cpp/language/copy_assignment

如果满足以下任一条件,则将类别T的默认副本分配运算符定义为已删除:-T具有非类类型的非静态数据成员(或其数组),该成员是const;

gapBetweenEnemies已被声明为私有,因此,该类之外的任何内容很少会无意中对其进行更改。我建议只删除const说明符。

为什么副本分配运算符很重要?我正在尝试删除内容,而不是复制分配它们

[从vector删除元素时,vector中所有在“被删除元素上方”的元素需要向下移动以填充间隙。这是通过副本分配运算符发生的。

来自https://en.cppreference.com/w/cpp/container/vector/erase

复杂度线性:对T的析构函数的调用次数与擦除的元素数相同,对T的赋值运算符的调用次数等于在擦除的元素之后向量中的元素数]

© www.soinside.com 2019 - 2024. All rights reserved.