Fehler C2280: Versuch zum Verweis auf eine gelöschte Funktion
Ich bin neu in der Spieleentwicklung und sehr neu in c++, aber ich habe begonnen, ein kleines Arkanoid Spiel. Ich habe es zuvor ausgeführt, aber nach dem refactoring (Einführung in die ArkanoidGame Klasse) es ist nicht kompilieren und ich kann nicht herausfinden, warum.
Die Fehler ich erhalte, ist:
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
Ich einfach nicht verstehen, was dies bedeutet und haben keine Ahnung, was zu tun ist, um es zu beheben.
Ich habe die Klassen in Frage:
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;
}
- In Arkanoid.h, Sie brauchen nicht zu erklären member-Funktionen mit ArkanoidGame:: wenn Sie sich nicht innerhalb der Klasse definition.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vermutlich entweder
Pad
oderBall
(oder beides) hat keinen Standard-Konstruktor; es kann daher nicht erzeugt werden für eine Klasse, die Sie enthält. Sie müssen initialisiert werden mit einem Ihrer Konstruktoren deklariert.Die beste Lösung ist, entfernen Sie Ihre seltsame
init
Funktion, und ersetzen Sie es mit einem Konstruktor:Wenn Sie wirklich wollen, eine zwei-Stufen-Initialisierung aus irgendeinem Grund tanzen, dann müssen Sie default-Konstruktoren für beide
Pad
undBall
. Ich würde nicht empfehlen, obwohl, es gibt weniger Raum für Fehler, wenn ein Objekt kann nicht erstellt werden, sich in einem ungültigen Zustand.Ich denke, dass das problem ist, dass entweder der Klasse oder Pad Klasse Ball hat keine der Standard-Konstruktor ( Sie haben zwei dtat Mitglieder dieser Klassen die in der Klasse die definition von ArkanoidGame: Pad-pad, Ball und ball;)
. In diesem Fall wird der compiler definiert, wird der default-Konstruktor der Klasse ArkanoidGame als gelöscht (sonst wird es krank ist-gebildet). Aber in der ersten Zeile der main
Sie versuchen, rufen Sie den Standardkonstruktor der Klasse ArkanoidGame.
Wird auch berücksichtigt, dass die Deklarationen der member-Funktionen haben soll, nicht qualifizierte Namen in der definition der Klasse.
So zum Beispiel diese Erklärung
ist ungültig. Wird
Sollten Sie einen Konstruktor für ArkanoidGame. In Arkanoid.h:
In Arkanoid.cpp:
Pad
oderBall
, oder sogar beide, werden nicht standardmäßig baubar).