ошибка C2280: попытка сослаться на удаленную функцию

Я новичок в разработке игр и очень плохо знаком с c ++, но я начал разрабатывать небольшую игру Arkanoid. У меня это было запущено ранее, но после рефакторинга (введение класса 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;
}

10

Решение

Предположительно, либо Pad или же Ball (или оба) не имеет конструктора по умолчанию; поэтому нельзя создать класс, который их содержит. Они должны быть инициализированы с использованием одного из объявленных конструкторов.

Лучшее решение состоит в том, чтобы удалить ваш странный 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);
// ...
}

Если по какой-то причине вы действительно хотите двухэтапный танец инициализации, вам нужно будет предоставить конструкторы по умолчанию для обоих Pad а также Ball, Я не рекомендовал бы это все же; есть меньше возможностей для ошибок, если объект не может быть создан в недопустимом состоянии.

14

Другие решения

Я думаю, что проблема в том, что либо класс Pad, либо класс Ball не имеют конструктора по умолчанию (у вас есть два члена dtat этих классов в определении класса ArkanoidGame: Pad pad; и Ball ball;)
, В этом случае компилятор определил конструктор по умолчанию класса ArkanoidGame как удаленный (в противном случае он будет некорректным). Однако в первой строке главного

ArkanoidGame game;

вы пытаетесь вызвать конструктор по умолчанию класса ArkanoidGame.

Примите также во внимание, что объявления функций-членов должны иметь безусловные имена в определении класса.
Так, например, это объявление

void ArkanoidGame::init(int, int);

является недействительным. Должен быть

void init(int, int);
5

Вы должны предоставить конструктор для ArkanoidGame. В Arkanoid.h:

ArkanoidGame ();

В Arkanoid.cpp:

ArkanoidGame::ArkanoidGame ()
{
// it is better to initialize members in the constructor,
// although not strictlynecessary
running = false;
}
3
По вопросам рекламы [email protected]