错误C2280。试图引用已删除的功能。尝试从数据结构中删除敌人和激光时出现此错误

时间:2016-02-24 08:45:07

标签: c++ oop

我正在使用OOP在C ++ / SDL中构建我的第一个游戏,并且遇到了我在游戏的单个文件版本中没有的问题。

在检查碰撞时,如果检测到碰撞,我希望玩家激光和敌舰从我的数据结构中被摧毁但是我收到一个我无法解决的错误。

错误C2280。试图引用已删除的函数。

如果没有发布太多代码并试图让您更容易阅读,我已经包含了我认为必要的内容。 正在从具有保持敌人和激光的数据结构的函数调用'CheckCollisions'。

谢谢。

game.cpp

void Game::start(Display& display, Media& media, Player& player)
{
    //Initialize SDL
    if (!display.init())
    {
        printf("Failed to initailize.", SDL_GetError());
    }
    else
    {
        //Load all media
        if (!media.load(display))
        {
            printf("Failed to load media", SDL_GetError());
        }
        else
    {
        SDL_Event e;

        std::vector<Enemy> enemies; //Holds all enemies
        std::vector<Laser> playerLasers; //Holds all of player lasers
        //std::vector<Laser> enemyLasers; //Holds all of the enemy lasers

        addEnemy(enemies); //Adds enemies to the game
        //Begin game loop
        while (!m_quit)
        {
            //Event management
            while (SDL_PollEvent(&e) != 0)
            {
                if(e.type == SDL_KEYDOWN)
                { 
                    player.movement(e);
                }
                if (e.type == SDL_MOUSEBUTTONDOWN)
                {
                    player.shoot(playerLasers);
                }
            }

            //Movement
            player.movementBounds();
            moveLasers(playerLasers);
            moveEnemies(enemies);

            //Collision detection
            checkCollisions(player, enemies, playerLasers);

            //Render
            display.render(media, player, enemies, playerLasers);


            //Simulate 60 fps - Read on tutorial, not entirely sure if this is ok. 
            SDL_Delay(16);
        }
    }
}

}

bool Game::checkCollisions(Player& player, std::vector<Enemy>& enemies, std::vector<Laser>& playerLasers, int& enemyPos)
{

    //Check for playerLaser/Enemy collision
    for (int playerLaser = 0; playerLaser < playerLasers.size(); playerLaser++)
    {
        for (int enemy = 0; enemy < enemies.size(); enemy++)
        {
            //If collision has been detected, delete both playerLaser and Enemy
            if (findPlayerLaserCollision(playerLasers[playerLaser], enemies[enemy]))
            {
                printf("Collision");
                playerLasers.erase(playerLasers.begin() + playerLaser);
                enemies.erase(enemies.begin() + enemy);

            }
        }
    }
}

Enemy.h

#pragma once

#include <SDL.h>
#include "MoveDirection.h"

struct Enemy
{
    Enemy(SDL_Rect pos, int movementSpeed, MoveDirection dir)
    {
        m_pos = pos;
        m_movementSpeed = movementSpeed;
        m_dir = dir;
    }

    SDL_Rect m_pos; //Position of enemy
    int m_movementSpeed = 0; //Movement speed of enemy
    MoveDirection m_dir; //Movement direction of enemy
    const int MIN_X_POS = 0;
    const int MAX_X_POS = 750;
};

Laser.h

#pragma once
#include <SDL.h>
#include "MoveDirection.h"
struct Laser
{
    Laser(SDL_Rect pos, int movementSpeed, MoveDirection dir)
    {
        m_pos = pos;
        m_movementSpeed = movementSpeed;
        m_dir = dir;
    }

    SDL_Rect m_pos; //Position of enemy
    int m_movementSpeed = 0; //Movement speed of enemy
    MoveDirection m_dir; //Movement direction of enemy
};

2 个答案:

答案 0 :(得分:1)

您使用for (int enemy = 0; enemy < enemies.size(); enemy++)开始循环,但在循环内调用enemies.erase(enemies.begin() + enemy);,这意味着循环索引现在无效。你开始使用大小为enemies.size()的向量,但是你通过在循环中调用erase来调整它的大小

答案 1 :(得分:1)

Enemy类有两个const成员,因此编译器无法为此类生成赋值运算符,并将其定义为已删除(因此会发生“已删除函数”错误)。