我是游戏开发的新手,也是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;
}
答案 0 :(得分:14)
据推测,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
提供默认构造函数。我不建议这样做;如果无法在无效状态下创建对象,则可以减少错误的范围。
答案 1 :(得分:5)
我认为问题是Pad类或类Ball没有默认构造函数(在ArkanoidGame的类定义中有两个这些类的dtat成员:Pad pad;和Ball ball;) 。在这种情况下,编译器将类ArkanoidGame的默认构造函数定义为已删除(否则它将是格式错误的)。但是在主要的第一行
ArkanoidGame game;
您尝试调用ArkanoidGame类的默认构造函数。
还要考虑到成员函数的声明在类定义中应具有不合格的名称。 例如,这个声明
void ArkanoidGame::init(int, int);
无效。应该
void init(int, int);
答案 2 :(得分:3)
你应该为ArkanoidGame提供一个构造函数。在Arkanoid.h:
ArkanoidGame ();
在Arkanoid.cpp中:
ArkanoidGame::ArkanoidGame ()
{
// it is better to initialize members in the constructor,
// although not strictlynecessary
running = false;
}