2016-03-08 275 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); 

这仅仅是从您的代码示例建设。我没有在本地运行这个例子。

基本上,您不需要使用多重继承来完成此任务。我建议不要使用继承来完成这个任务,因为它不是必需的,如果你不需要,你应该尽量不要使用继承!这是非常谨慎的事情。

相关问题