所以我有两个类:Object和Player。 我希望Player继承自Object,因为Object具有我需要的基本功能。 播放器具有附加功能,可以从Object扩展中扩展。 我有四个文件: Object.cpp,Object.h,Player.cpp和Player.h。
为了说明我的情况,我在我的Player类中添加了一个变量: playerVariable。我的Object构造函数参数不包含这个,但是我的Player构造函数没有,所以你可以看到Player扩展了Object。
无论如何,这是我的代码:
Object.h:
#include <hge.h>
#include <hgesprite.h>
#include <hgeanim.h>
#include <math.h>
class Object{
int x, y;
HTEXTURE tex;
hgeAnimation *anim;
float angle, FPS, velocity;
public:
Object(int x, int y, HTEXTURE tex, float FPS);
//Setters
void SetX(int x);
void SetY(int y);
void SetSpeed(int FPS); //Image Speed
void SetAngle(float angle); //Image Angle
void SetVelocity(float velocity); //Object Speed/Velocity
//Getters
};
Object.cpp:
/*
** Object
**
*/
#include <hge.h>
#include <hgesprite.h>
#include <hgeanim.h>
#include <math.h>
#include "Object.h"
Object::Object(int x, int y, HTEXTURE tex, float FPS){
this->x = x;
this->y = y;
this->tex = tex;
this->FPS = FPS;
}
//Setters
void Object::SetX(int x){
this->x = x;
}
void Object::SetY(int y){
this->x = x;
}
void Object::SetSpeed(int FPS){
this->FPS = FPS;
anim->SetSpeed(FPS);
}
void Object::SetAngle(float angle){
this->angle = angle;
}
void Object::SetVelocity(float velocity){
this->velocity = velocity;
}
//Getters
Player.h:
#include <hge.h>
#include <hgesprite.h>
#include <hgeanim.h>
#include <math.h>
#include "Object.h"
class Player : public Object{
int playerVariable;
public:
Player(int x, int y, HTEXTURE tex, float FPS, int playerVariable);
//Setters
void SetX(int x);
void SetY(int y);
void SetSpeed(int FPS); //Image Speed
void SetAngle(float angle); //Image Angle
void SetVelocity(float velocity); //Object Speed/Velocity
//Getters
};
Player.cpp:
/*
** Object
**
*/
#include <hge.h>
#include <hgesprite.h>
#include <hgeanim.h>
#include <math.h>
#include "Object.h"
#include "Player.h"
Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable){
this->x = x;
this->y = y;
this->tex = tex;
this->FPS = FPS;
}
//Setters
void Object::SetX(int x){
this->x = x;
}
void Object::SetY(int y){
this->x = x;
}
void Object::SetSpeed(int FPS){
this->FPS = FPS;
anim->SetSpeed(FPS);
}
void Object::SetAngle(float angle){
this->angle = angle;
}
void Object::SetVelocity(float velocity){
this->velocity = velocity;
}
//Getters
我的问题是,我不确定我是否正确设置。 我已经看过关于继承的教程,但我不知道如何用它们进行设置 .h文件和类的.cpp文件。有人可以帮忙吗?
答案 0 :(得分:3)
您正在定义Object
两次功能。您无需定义该内容,它将从Object
继承,并自动在Player
上提供。
您的Player
构造函数需要调用基础Object
构造函数。这是通过构造函数初始化列表完成的:
Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable)
: Object(x, y, tex, FPS) // forward arguments to base constructor
{}
答案 1 :(得分:0)
您可以通过这种方式调用基类构造函数,指定每个参数:
Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable): Object(x, y, tex, FPS) {
答案 2 :(得分:0)
看起来您实际上不需要课程Player
来覆盖SetX(int)
,SetY(int)
,SetSpeed(int)
,SetAngle(float)
和SetVelocity(float)
Object
。如果您这样做,那么您将创建这些Object
成员函数virtual
。
其他几点说明:
Object
中重新定义Player.cpp
成员函数。 Player
是Object
,因此它继承了类Object
的成员函数。此外,如果Object.cpp
和Player.cpp
中的实现之间存在任何差异,那么由于违反了单一定义规则,您将收到链接器错误。Object
析构函数应声明为virtual
。您可以使用初始化列表,而不是直接在Object
构造函数中设置Player
的成员:
Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable)
: Object(x, y, tex, FPS), playerVariable(playerVariable)
{
}
使用初始化列表效率更高。在这种情况下甚至是必要的,因为Object::x
,Object::y
,Object::tex
和Object::FPS
都是Object
和朋友的私人。
Object
中,您应该提供自定义复制构造函数和copy-assign运算符重载(Object::operator=(const Object&)
)。 C ++编译器为您提供了这些成员函数的默认实现,但由于您有指针成员和HTEXTURE
成员,因此您可能需要提供显式实现来处理深层复制。复制构造函数和复制赋值重载必须始终进行深层复制。FPS
的类型不匹配。 Object::FPS
成员被声明为float
,但Object::SetSpeed(int)
的参数为int
。