0

好的,我的 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));
}
4

2 回答 2

2

您的Sprite类有一个Vector将在构造时Sprite构造的成员。目前,Vector将使用默认构造函数初始化,因为您没有另外指定。如果要使用特定的构造函数,Vector则需要在构造函数中添加初始化列表Sprite

Sprite::Sprite(int x, int y)
  : movement(1.0, 0.0)
{
  // ...
}

这将movement使用参数10. 事实上,您也可以将其他成员添加到您的初始化列表中:

Sprite::Sprite(int x, int y)
  : movement(1.0, 0.0), x(x), y(y), lastX(x), lastY(y) // and so on...
{
  // ...
}
于 2012-12-23T23:48:49.070 回答
1

Vector创建Sprite::Sprite(int x, int y)于. 调用空白构造函数Vector是因为您没有调用初始化列表中的构造函数:实际上,您Vector movement完全未初始化!

做这个:

Sprite::Sprite(int x, int y):
  movement(3.14, 2.7)
{
  ...
}

movement使用两个参数构造函数进行构造。我会选择比3.14and更好的值2.7,这些只是样本值。

Vector为了便于使用,我还会考虑创建一个公共的无参数构造函数,将速度和角度初始化为零。

于 2012-12-23T23:48:28.840 回答