从Vector中派生类中的Access对象

时间:2011-01-11 06:06:05

标签: c++ sfml

我有一个Entity基类,类Player和Enemy Inherit。

class Entity
{
  public:

    virtual void Update(sf::RenderWindow &window) {};
    virtual void Draw(sf::RenderWindow &window) {};

};

玩家和敌人都包含一个如下所示的精灵对象:

class Player : Entity
{
   public:

   sf::Sprite sprite

    void Update(sf::RenderWindow &window);
    void Draw(sf::RenderWindow &window)
}

玩家和敌人是在一个矢量中创建的,这个矢量设置如下:

class EntityManager
{
   public:
   void CollisionCheck();
   private:
   std::vector<Entity*> entityVector;
}

我希望使用这种形式的碰撞检测功能:

bool Collision::CircleTest(const sf::Sprite& Object1, const sf::Sprite& Object2)

所以我想尝试这样的事情:

void EntityManager::ColCheck()
{
   if (Collision::CircleTest(entityVector[0]->sprite, entityVector[1]->sprite))
      {
         cout << "COLLISION\n";
      }
}

这会导致以下编译错误:

'class Entity'没有名为'sprite'的成员

我不确定如何在Entity中创建一个虚拟精灵,以便我可以使用上述方法访问玩家和敌人的精灵。这可能吗?

我很难过,非常感谢任何人都可以提供帮助!

4 个答案:

答案 0 :(得分:1)

你可能不应该创建一个假人,除非有精灵是所有实体都有的。

您可能想要的是使用访问者模式或可能是多个多调度实现之一。哪个以及哪个最终必须由您决定。

答案 1 :(得分:1)

如果代码中派生自Entity的所有内容都有sprite对象,那么您应该在基类中声明该对象。

不声明基类中的对象意味着可能有一个继承自Entity的类没有精灵对象,这意味着ColCheck没有有效的基础来假设entityVector指向具有名为sprite的变量的内容。有意义吗?

答案 2 :(得分:1)

如果PlayerEnemy类都包含sprite,为什么不在Entity内声明它?这应该可以解决你的问题。

答案 3 :(得分:0)

您可以创建一个在sprite()内声明为纯虚函数的成员函数Entity

class Entity {
public:
    virtual void Update(sf::RenderWindow &window) {};
    virtual void Draw(sf::RenderWindow &window) {};

    virtual sf::Sprite& sprite() = 0;
};

然后,PlayerEnemy实现将返回每个sf::Sprite实例变量。然而,其他海报提出了一个有效的观点;如果所有派生类都有一个sprite,那么将sprite放在基类中可能是有意义的。