Наследование конструктора в файлах .h и .cpp - PullRequest
0 голосов
/ 18 октября 2011

Итак, у меня есть два класса: Object и Player.Я хочу, чтобы Player наследовал от 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 ]

3 голосов
/ 18 октября 2011

Вы определяете функциональность 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
{}
0 голосов
/ 18 октября 2011

Похоже, вам на самом деле не нужен класс Player для переопределения SetX(int), SetY(int), SetSpeed(int), SetAngle(float) и SetVelocity(float) из Object.Если бы вы это сделали, вы бы сделали эти Object функции-члены virtual.

Несколько других замечаний:

  1. Вам не нужно переопределять член Objectфункции в Player.cpp.Player является Object, поэтому он наследует функции-члены класса Object.Кроме того, если есть различия между реализацией в Object.cpp и Player.cpp, вы получите ошибки компоновщика из-за нарушения правила One Definition.
  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::x, Object::y, Object::tex и Object::FPS являются частными для Object и друзей.

  4. В Object, вы должныпредоставить пользовательский конструктор копирования и перегрузку оператора копирования-назначения (Object::operator=(const Object&)).Компилятор C ++ предоставляет реализации этих функций-членов по умолчанию, но поскольку у вас есть члены-указатели и HTEXTURE члены, вам, вероятно, потребуется предоставить явные реализации для обработки глубокой копии.Конструктор копирования и перегрузка копирования-назначения всегда должны создавать глубокие копии.
  5. Несоответствие типу FPS.Элемент Object::FPS объявлен как float, но параметр Object::SetSpeed(int) является int.
0 голосов
/ 18 октября 2011

Вы можете вызвать конструктор базового класса таким образом, указав каждый параметр:

Player::Player(int x, int y, HTEXTURE tex, float FPS, playerVariable): Object(x, y, tex, FPS) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...