我目前正在使用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)
这样的东西。这看起来很糟糕。有什么方法可以更好地解决这个问题吗?
答案 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);
这仅仅是从您的代码示例构建的。我没有在本地运行这个例子。
基本上,您不需要使用多重继承来完成此任务。我建议甚至不使用继承来执行此任务,因为它不需要,如果不需要,你应该尽量不使用继承!这是非常谨慎的事情。