2016-03-08 124 views
0

我目前正在用C++開發一個遊戲。現在我是C++的初學者,只是想習慣多繼承的概念。我的遊戲有一個玩家類。該玩家類從定位繼承(賦予玩家x和y座標)和可移動(允許玩家移動)。問題在於Moveable必須知道玩家的配合才能充分調動他。這裏是什麼,我試圖完成基本僞(ISH)代碼:C++將父指針傳遞給父類構造函數

class Movable 
{ 

private: 
    Positionable *positionable; 

public: 
    Movable(Positionable *positionable) 
     : positionable(positionable) 
    { } 

    void Translate(float x, float y) 
    { 
     positionable->setX(positionable->getX() + x); 
     positionable->setY(positionable->getY() + y); 
    } 
} 

class Positionable 
{ 
private: 
    float x, y; 
public: 
    Positionable(float x, float y) 
     : x(x), 
     y(y) 

    float getX() { return this->x; } 
    float getY() { return this->y; } 
    float setX(float val) { this->x = val; } 
    float setY(float val) { this->y = val; } 
} 

class Player : public Positionable, public Movable 
{ 
    Player(float x, float y) 
     : Positionable(x, y) 
     : Movable((Positionable) this) 
    { } 
} 

... 

Player player; 
player.Translate(50, 50) 

我的問題是是否有更好的方式來傳遞Positionable動產的constuctor,因爲如果Moveable依賴於3個班,我將不得不寫一些像Movable((FirstClass) this, (SecondClass) this, (ThirdClass) this)。這看起來很糟糕。有什麼辦法可以更好地解決這個問題嗎?

+0

的「I」前綴表示你的意思是有接口的,但你沒有任何的多態行爲,實際創建的具體類(無虛函數) 。建議是跳過'我'不要混淆你自己或他人。 –

+2

爲什麼不確定IMovable繼承自IPositionable,因爲它需要位置才能移動並使Player從IMovable繼承?然後在構造函數中讓Player調用IMovable,然後inturn調用具有x,y值的IPositionable。 這不會解決你的問題嗎? –

+0

你不必投(而且你投錯了類型:缺少'*')。 – Jarod42

回答

1

由於@BandiKishore在評論中提出,更好的方法是從Positionable繼承Movable(並且僅從Movable繼承Player)。 Movable需要訪問座標來完成它的移動工作,並且名稱Movable表明它應該自己移動(this),而不是其他某個對象(在這種情況下,它應該是MoverMovingHelper或smth,就像那樣),所以繼承更多比代表團更合理。

Player將不得不調用只有一個基類的構造:

class Movable : public Positionable 
{ 
public: 
    Movable(float x, float y) : Positionable(x, y) 
    { } 
} 

class Player : public Movable 
{ 
    Player(float x, float y) : Movable(x, y) 
    { } 
} 
-1

如果您僅使用它來保存/訪問X和Y值,我會將您的IPositionable類變爲結構體。

如果你以前沒有使用結構,這裏是一個簡要介紹:http://www.cplusplus.com/doc/tutorial/structures/

現在只要你IMoveable類,我會放一個IPositionable成員在類像你一樣,但在你的IMoveable intialize它contstructor。這裏是我的意思一個非常粗略的例子:

class IMovable 
    { 

    private: 
     IPositionable *positionable; 

    public: 
     IMovable(int x, int y) 
     { 
      positionable->setX(x); 
      positionable->setY(y); 
     } 

     void Translate(float x, float y) 
     { 
      positionable->setX(positionable->getX() + x); 
      positionable->setY(positionable->getY() + y); 
     } 
    } 

那麼你就必須:

class Player 
    { 
     private IMoveable moveable; 
     Player(float x, float y) 
      : moveable(x, y) 
     { } 
    } 

    ... 

    Player player(100, 100); 
    player.Translate(50, 50); 

這僅僅是從您的代碼示例建設。我沒有在本地運行這個例子。

基本上,您不需要使用多重繼承來完成此任務。我建議不要使用繼承來完成這個任務,因爲它不是必需的,如果你不需要,你應該儘量不要使用繼承!這是非常謹慎的事情。

相關問題