在.h和.cpp文件中继承构造函数

时间:2011-10-17 21:50:01

标签: c++ inheritance constructor

所以我有两个类: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文件。有人可以帮忙吗?

3 个答案:

答案 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

其他几点说明:

  1. 您无需在Object中重新定义Player.cpp成员函数。 PlayerObject,因此它继承了类Object的成员函数。此外,如果Object.cppPlayer.cpp中的实现之间存在任何差异,那么由于违反了单一定义规则,您将收到链接器错误。
  2. Object析构函数应声明为virtual
  3. 您可以使用初始化列表,而不是直接在Object构造函数中设置Player的成员:

    Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable)
        : Object(x, y, tex, FPS), playerVariable(playerVariable)
    {
    }
    

    使用初始化列表效率更高。在这种情况下甚至是必要的,因为Object::xObject::yObject::texObject::FPS都是Object和朋友的私人。

  4. Object中,您应该提供自定义复制构造函数和copy-assign运算符重载(Object::operator=(const Object&))。 C ++编译器为您提供了这些成员函数的默认实现,但由于您有指针成员和HTEXTURE成员,因此您可能需要提供显式实现来处理深层复制。复制构造函数和复制赋值重载必须始终进行深层复制。
  5. FPS的类型不匹配。 Object::FPS成员被声明为float,但Object::SetSpeed(int)的参数为int