设计继承类

时间:2012-05-22 01:58:30

标签: c++ templates inheritance

假设我有一个实体类 然后我有n个派生自实体的类 例如:

class Snake : public Entity{...};  
class Mouse : public Entity{...};

现在我有一个实体的班级玩家 我可以创建一个继承任何类型实体的类播放器吗? 例如:

class Player : public Entity -->(but instead of entity be any type of entity)  

这可以吗?
这是通过使用模板实现的吗? 我读过可以在cpp文件中明确指定模板,即

template class Entity<Snake>;

我正在努力实现以下目标

在我的播放器类中,我有一个moveCamera函数内移动现在只有当玩家移动时,相机移动..如果AI Snake移动,相机不应移动。

这是我在虚拟实体类中的渲染函数

void Entity::Render(float interpolation)
{
  if(currentAnimation != 0){
    float x = this->currLocation.x - (this->currentVelocity.x * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).x;
    float y = this->currLocation.y - (this->currentVelocity.y * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).y;
    currentAnimation->Render(x,y);
  }
}

这是我的gameUpdate函数,基本上将实体移动到各自的世界坐标

void Entity::GameUpdate(float gameUpdateDelta)
{
  this->Move();
}

因此,对于我的播放器移动功能,我将调用相机的移动功能,然后调用基类的移动功能......现在可以调用扩展类的基地的班级移动功能。
我的移动功能是虚拟的,因此蛇和鼠标可以以不同的方式移动..

2 个答案:

答案 0 :(得分:1)

您可能希望编写一个继承自Template参数的模板类Player

template< typename Derived >
class Player: 
    public Derived, // we believe that Derived inherits Entity
    public IPlayer  // makes sense if Player is not a Entity only interface
{
   ... some declaration here ...

   void update(); // some virtual method from Entity interaface
   void player_action(); // some virtual method from IPlayer interaface

}

创建具体类型的玩家时,您可以将其放置在场景中。

IPlayer* player1 = new  Player<Snake>("Player1");

Entity* playerEntity = dynamic_cast< Entity* >( player1 );
if( playerEntity ) // test if object can be placed on scene
{
    scene->add( playerEntity );
}

您可能还需要知道如何编写类方法的部分模板特化。 你也可以发现boost enable_if是一个强大的玩具。

答案 1 :(得分:0)

如果您可以发布当前设计的界面(只是类定义),那么人们会更有帮助。看起来你需要制造玩家自己的蛇和老鼠。如果您希望某些操作与其他操作相关联,请使用观察者。