【问题标题】:error C2280: attempting to reference a deleted function错误 C2280:试图引用已删除的函数
【发布时间】:2014-02-19 23:29:07
【问题描述】:

我是游戏开发的新手,对 c++ 也很陌生,但我已经开始开发一款打砖块小游戏。我之前运行过它,但是在重构(引入 ArkanoidGame 类)之后它无法编译,我不知道为什么。

我得到的错误是:

d:\dropbox\development\gamedev\c++\arkanoid\arkanoid\main.cpp(14): error C2280:
    'ArkanoidGame::ArkanoidGame(void)' : attempting to reference a deleted function
d:\dropbox\development\gamedev\c++\arkanoid\arkanoid\arkanoidgame.h(25) : 
    compiler has generated 'ArkanoidGame::ArkanoidGame' here

我只是不明白这意味着什么,也不知道如何解决它。

我已经包含了有问题的课程:

Main.cpp:

#include "ArkanoidGame.h"

int main() {
    ArkanoidGame game;
    game.init(800, 600);
    while (game.isRunning()) {
        game.checkInput();
        game.checkCollisions();
        game.draw();
    }
    return 0;
}

Arkanoid.h:

#include "Ball.h"
#include "Pad.h"
#include <SFML/Graphics.hpp>
#include <stdarg.h>
#include <memory>

class ArkanoidGame
{
private:
    bool running;
public:
    void ArkanoidGame::init(int, int);
    bool ArkanoidGame::isRunning();
    void ArkanoidGame::checkCollisions();
    void ArkanoidGame::checkInput();
    void ArkanoidGame::update();
    void ArkanoidGame::draw();
    sf::RenderWindow* window;
    Pad pad;
    Ball ball;
};

ArkanoidGame.cpp:

#include "ArkanoidGame.h"

void ArkanoidGame::init(int windowWidth, int windowHeight) {
    window = new sf::RenderWindow(sf::VideoMode(windowWidth, windowHeight), "Arkanoid!");
    window->setFramerateLimit(60);

    ArkanoidGame::running = true;

    //Init pad
    pad = Pad((float)(windowWidth / 2), (float)(windowHeight - 50));

    //Init ball
    ball = Ball(0.f, 0.f);
}

template<class T1, class T2> bool intersect(T1& mA, T2& mB) {
    return mA.right() >= mB.left() && mA.left() <= mB.right()
        && mA.bottom() >= mB.top() && mA.top() <= mB.bottom();
}

void ArkanoidGame::checkCollisions() {
    if (!intersect(pad, ball)) return;

    ball.velocity.y = -ball.ballVelocity;

    if (ball.x() < pad.x()) {
        ball.velocity.x = -ball.ballVelocity;
    }
    else {
        ball.velocity.x = ball.ballVelocity;
    }
}

void ArkanoidGame::update() {
    //Update positions
    pad.update(window->getSize().x);
    ball.update(window->getSize().x, window->getSize().y);
}

void ArkanoidGame::draw() {
    window->clear(Color::Black);
    window->draw(pad.getShape());
    window->draw(ball.getShape());
    window->display();
}

void ArkanoidGame::checkInput() {
    if (Keyboard::isKeyPressed(Keyboard::Key::Escape)) {
        running = false;
    }
}

bool ArkanoidGame::isRunning() {
    return running;
}

【问题讨论】:

  • 在 Arkanoid.h 中,当成员函数在类定义中时,您不需要使用 ArkanoidGame:: 声明成员函数。

标签: c++ pointers compiler-errors deleted-functions


【解决方案1】:

推测PadBall(或两者)都没有默认构造函数;因此无法为包含它们的类生成一个。它们必须使用它们声明的构造函数之一进行初始化。

最好的解决办法是去掉你奇怪的init函数,并用构造函数替换它:

ArkanoidGame(int windowWidth, int windowHeight) :
    running(true),
    window(new ...),
    Pad(windowWidth / 2, windowHeight - 50),
    Ball(0,0)
{
    window->setFramerateLimit(60);
}

int main() {
    ArkanoidGame game(800, 600);
    // ...
}

如果出于某种原因你真的想要一个两阶段的初始化舞蹈,那么你需要为PadBall 提供默认构造函数。不过我不建议这样做;如果无法在无效状态下创建对象,则错误的范围会更小。

【讨论】:

    【解决方案2】:

    我认为问题在于 Pad 类或 Ball 类都没有默认构造函数(在 ArkanoidGame 的类定义中有这些类的两个 dtat 成员:Pad pad; 和 Ball ball;) .在这种情况下,编译器将 ArkanoidGame 类的默认构造函数定义为已删除(否则它将是错误的)。但是在 main 的第一行

    ArkanoidGame game;
    

    您尝试调用 ArkanoidGame 类的默认构造函数。

    还要考虑到成员函数的声明在类定义中应具有非限定名称。 所以例如这个声明

    void ArkanoidGame::init(int, int);
    

    无效。应该是

    void init(int, int);
    

    【讨论】:

      【解决方案3】:

      您应该为 ArkanoidGame 提供一个构造函数。在 Arkanoid.h 中:

      ArkanoidGame ();
      

      在 Arkanoid.cpp 中:

      ArkanoidGame::ArkanoidGame ()
      {
          // it is better to initialize members in the constructor,
          // although not strictlynecessary
          running = false;
      }
      

      【讨论】:

      • 并非如此。由于其他答案中解释的原因,此默认构造函数可能无法编译(PadBall,甚至两者都不可默认构造)。
      猜你喜欢
      • 2014-09-15
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多