класс C ++ Sprite с векторным объектом в качестве члена

Хорошо, у меня есть эта проблема с моим классом Sprite. По сути, у класса sprite должен быть объект класса Vector, а Vector — класс с углом и скоростью. Класс Vector имеет конструктор Vector (double, double), поэтому скорость и угол можно задать при его инициализации, но когда я создаю свой класс спрайтов. Он отправляет ошибку, что вызывает 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

Решение

Ваш 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...
{
// ...
}
2

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

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 для простоты использования, которая инициализирует скорость и угол к нулю.

1

По вопросам рекламы [email protected]