好的,我的Sprite类遇到了这个问题。基本上sprite类应该有一个Vector类的对象作为其成员,Vector是一个具有角度和速度的类。 Vector类有一个Vector(double,double)构造函数,因此可以在初始化时设置速度和角度,但是当我创建sprite类时。它发送一个错误,它调用Vector(),一个空白构造函数,并且它不存在。我想弄清楚它为什么调用Vector()。这是我的Sprite和Vector类的代码。
#Vector.h
#ifndef VECTOR_H
#define VECTOR_H
class Vector
{
public:
Vector(double,double);
double getX();
double getY();
double getSpeed();
double getAngle();
void setSpeed(double);
void setAngle(double);
private:
double speed,angle;
};
#endif
#Vector.h
#include "SDL/SDL.h"
#include "vector.h"
#include "math.h"
Vector::Vector(double speed,double angle)
{
this -> speed = speed;
this -> angle = angle;
}
double Vector::getX()
{
return speed*cos(angle);
}
double Vector::getY()
{
return speed*sin(angle);
}
double Vector::getSpeed()
{
return speed;
}
double Vector::getAngle()
{
return angle;
}
void Vector::setAngle(double angle)
{
this -> angle = angle;
}
void Vector::setSpeed(double speed)
{
this -> speed = speed;
}
#Sprite.h:
#ifndef SPRITE_H
#define SPRITE_H
#include "vector.h"
class Sprite
{
public:
Sprite(int x,int y);
SDL_Rect getRect();
SDL_Surface* getImage();
void setRect(SDL_Rect);
void move();
void draw(SDL_Surface*);
private:
Vector movement;
double x,y,lastX,lastY,angle,speed;
SDL_Rect rect;
SDL_Surface* image;
};
#endif
#Sprite.cpp:
#include "SDL/SDL.h"
#include "sprite.h"
#include "functions.h"
#include <cmath>
Sprite::Sprite(int x, int y)
{
this -> x = x;
this -> y = y;
lastX = x;
lastY = y;
image = loadImage("box.png");
rect.x = x;
rect.y = y;
rect.w = image->w;
rect.h = image->h;
speed = 1;
angle = 0;
}
SDL_Rect Sprite::getRect()
{
return rect;
}
SDL_Surface* Sprite::getImage()
{
return image;
}
void Sprite::setRect(SDL_Rect rect)
{
this -> rect = rect;
}
void Sprite::move()
{
lastX = x;
lastY = y;
x += speed*cos(angle);
y += speed*sin(angle);
rect.x = int(x);
rect.y = int(y);
}
void Sprite::draw(SDL_Surface* dest)
{
blit(image,dest,int(x),int(y));
}
答案 0 :(得分:2)
您的Sprite
班级有一个Vector
成员,将在构建Sprite
时构建。目前,Vector
将使用默认构造函数进行初始化,因为您没有另行指定。如果要使用Vector
的特定构造函数,则需要将初始化列表添加到Sprite
的构造函数中:
Sprite::Sprite(int x, int y)
: movement(1.0, 0.0)
{
// ...
}
这会使用参数movement
和1
初始化0
。实际上,您也可以将其他成员添加到初始化列表中:
Sprite::Sprite(int x, int y)
: movement(1.0, 0.0), x(x), y(y), lastX(x), lastY(y) // and so on...
{
// ...
}
答案 1 :(得分:1)
在Vector
中创建了Sprite::Sprite(int x, int y)
。调用Vector
的空白构造函数是因为您没有在初始化列表中调用构造函数:实际上,您将Vector movement
完全取消了初始化!
这样做:
Sprite::Sprite(int x, int y):
movement(3.14, 2.7)
{
...
}
使用两个参数构造函数构造movement
。我会选择比3.14
和2.7
更好的值,这些只是示例值。
我还考虑在Vector
上创建一个公共无参数构造函数,以便于将速度和角度初始化为零。