C ++将父指针传递给父类构造函数

时间:2016-03-08 13:49:31

标签: c++ inheritance

我目前正在使用C ++开发游戏。现在我是C ++的初学者,我只是想习惯多继承的概念。我的游戏有玩家类。该玩家类继承自Positionable(给予玩家x和y coords)和Moveable(允许玩家移动)。问题在于,Moveable必须知道玩家的坐标才能充分移动他。这是我想要完成的基本伪(ish)代码:

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传递给Movable的构造函数,因为如果Moveable依赖于3个类,我将不得不编写像Movable((FirstClass) this, (SecondClass) this, (ThirdClass) this)这样的东西。这看起来很糟糕。有什么方法可以更好地解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

正如@BandiKishore在评论中所建议的,更好的方法是从Movable继承Positionable(并仅从Player继承Movable)。 Movable需要访问坐标来执行其移动工作,名称Movable表明它应该移动自己(this),而不是其他一些对象(在这种情况下它将是{{} 1}}或Mover或smth。就像那样),所以继承比委托更合乎逻辑。

MovingHelper必须只调用一个基本构造函数:

Player

答案 1 :(得分:-1)

如果您只使用它来保存/访问X和Y值,我会将您的IPositionable类转换为结构。

如果您之前没有使用结构,请参阅以下简要概述:http://www.cplusplus.com/doc/tutorial/structures/

现在,就你的IMoveable类而言,我会像你一样在类中放置一个IPositionable成员,但是在你的IMoveable 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);

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

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