0

わかりました。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));
}
4

2 に答える 2

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

movement2つの引数のコンストラクターを使用して構築します。3.14とよりも良い値を選択2.7します。これらは単なるサンプル値です。

Vectorまた、速度と角度をゼロに初期化する使いやすさのために、引数のないパブリックコンストラクターを作成することも検討します。

于 2012-12-23T23:48:28.840 に答える