2014-01-28 8 views
8

Ich bin neu in der Spieleentwicklung und sehr neu in C++, aber ich habe angefangen, ein kleines Arkanoid-Spiel zu entwickeln. Ich habe es vorher laufen lassen, aber nach Refactoring (Einführung der ArkanoidGame-Klasse) kompiliert es nicht und ich kann nicht herausfinden, warum.Fehler C2280: Versuch, eine gelöschte Funktion zu referenzieren

Der 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 das bedeutet und habe keine Ahnung, was es zu tun zu beheben.

Ich habe die Klassen in Frage enthalten:

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; 
} 
+1

In Arkanoid.h müssen Sie Memberfunktionen nicht mit ArkanoidGame :: deklarieren, wenn sie innerhalb der Klassendefinition sind. – user2079303

Antwort

14

Vermutlich entweder Pad oder Ball (oder beide) keinen Standardkonstruktors; daher kann man nicht für eine Klasse generiert werden, die sie enthält. Sie müssen mit einem ihrer deklarierten Konstruktoren initialisiert werden.

Die beste Lösung ist Ihre seltsame init Funktion zu entfernen und ersetzen Sie es mit einem Konstruktor:

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); 
    // ... 
} 

Wenn Sie wirklich ein zweistufiger Initialisierung Tanz aus irgendeinem Grund wollen, dann müssen Sie bieten Standardkonstruktoren für beide Pad und Ball. Ich würde das aber nicht empfehlen; Es gibt weniger Möglichkeiten für Fehler, wenn ein Objekt nicht in einem ungültigen Zustand erstellt werden kann.

5

Ich denke, dass das Problem ist, dass entweder cl Ass Pad oder Klasse Ball hat keinen Standardkonstruktor (Sie haben zwei dtat Mitglieder dieser Klassen in der Klassendefinition von ArkanoidGame: Pad Pad; und Ball Ball;) . In diesem Fall hat der Compiler den Standardkonstruktor der Klasse ArkanoidGame als gelöscht definiert (sonst wird er schlecht gebildet). In der ersten Zeile von Haupt

ArkanoidGame game; 

versuchen Sie, den Standardkonstruktor der Klasse ArkanoidGame aufzurufen.

Beachten Sie auch, dass Deklarationen von Elementfunktionen in der Klassendefinition nicht qualifizierte Namen haben dürfen. So zum Beispiel diese Erklärung

void ArkanoidGame::init(int, int); 

ist ungültig. Sollen

sein
void init(int, int); 
3

Sie sollten einen Konstruktor für ArkanoidGame bereitstellen. In Arkanoid.h:

ArkanoidGame(); 

In Arkanoid.cpp:

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

Nicht wirklich.Dieser Standardkonstruktor wird wahrscheinlich nicht aus den Gründen kompiliert, die in anderen Antworten erklärt wurden (entweder "Pad" oder "Ball" oder beide sind nicht standardmäßig konstruierbar). – Gorpik

Verwandte Themen