2011-10-17 11 views
0

オブジェクトとプレーヤという2つのクラスがあります。 オブジェクトには基本的な機能が必要なので、Playerにオブジェクトを継承させたい。 Playerには、Objectが実行できる機能から拡張された機能が追加されています。 私は4つのファイルを持っています: Object.cpp、Object.h、Player.cpp、Player.h。.hと.cppファイルにコンストラクタを継承する

私の状況の例を作るために、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 
}; 

プレーヤー

とにかく、ここに私のコードです。 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ファイルの両方でセットアップする方法はわかりません。助けてもらえますか?

+1

あなたの実際の問題を述べ、あなたの問題を明らかにする(最小限の)コードを投稿してください。 –

+0

.cppのすべてがPlayerだけを参照する必要があります。あなたはプレイヤーの宣言で基本クラスについて言及する必要があります –

答えて

0

あなたはすべてのパラメータを指定して、このよう基底クラスのコンストラクタを呼び出すことができます。

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

今私は間違っているのですか? http://pastebin.com/zN60ce2T私は、基本クラスのコンストラクタを呼び出している ... Object.h: http://pastebin.com/zN60ce2T Object.cpp: http://pastebin.com/mJdLSM6e Player.h: http://pastebin.com/fhDtGfb2 Player.cpp: http://pastebin.com/fhDtGfb2 –

+0

誰かが間違っていることを知っていますか? –

+0

Object.hとPlayer.cppのリンクが間違っています。 pastebinのリンクを投稿するのではなく、元の質問を更新してください。 –

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 
{} 
0

あなたが実際にSetX(int)SetY(int)SetSpeed(int)SetAngle(float)、およびObjectSetVelocity(float)をオーバーライドするクラスPlayerを必要としないように見えます。そうした場合は、Objectのメンバー関数virtualを作成します。

他のいくつかの注意事項:

  1. あなたはPlayer.cppObjectメンバ関数を再定義する必要はありません。 PlayerObjectなので、クラスObjectのメンバ関数を継承しています。また、Object.cppPlayer.cppの実装間に相違がある場合、1つの定義ルール違反のためにリンカーエラーが発生します。
  2. Objectデストラクタは、virtualと宣言する必要があります。
  3. よりもむしろPlayerコンストラクタで直接Objectのメンバーを設定するには、初期化リストを使用することができます。初期化リストを使用して

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

    は、はるかに効率的です。この場合でも、Object::x,Object::yObject::tex、およびObject::FPSはすべてObjectとお友達にはプライベートであるためです。

  4. Objectには、カスタムコピーコンストラクタとコピー割り当てオペレータオーバーロード(Object::operator=(const Object&))を提供する必要があります。 C++コンパイラでは、これらのメンバー関数のデフォルトの実装が提供されていますが、ポインタメンバーとHTEXTUREのメンバがあるため、ディープコピーを処理する明示的な実装を提供する必要があります。コピーコンストラクタとコピーアサインオーバーロードは、常にディープコピーを作成する必要があります。
  5. FPSのタイプに不一致があります。 Object::FPSメンバはfloatと宣言されますが、Object::SetSpeed(int)のパラメータはintです。
関連する問題