【问题标题】:Access object in derived class from Vector从 Vector 访问派生类中的对象
【发布时间】:2011-01-11 06:06:05
【问题描述】:

我有一个 Entity 基类,它继承了 Player 和 Enemy 类。

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)
}

Player 和 Enemy 是在一个向量中创建的,向量设置如下:

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 中创建一个虚拟精灵,以便我可以使用上述方法访问玩家和敌人的精灵。这可能吗?

我很难过,如果有人能提供任何帮助,我将不胜感激!

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复!如果我在 Entity 中声明“Sf::Sprite sprite”,那么代码将编译,但它似乎不会影响我试图访问的向量中对象的 sprite。所以像 'entityVector[0]->sprite.move(1.0)' 这样的东西实际上似乎根本不会影响那个精灵。
    • 这可能是一个完全独立的问题。没有看到move 的代码就无法判断。我建议尝试尽可能简单的测试用例并发布一个新问题。
    • 成功了,问题是我在实体和播放器中都声明了 sf::Sprite sprite。一旦我从 Player 中删除它,一切都停止了抱怨。干杯!
    【解决方案2】:

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

    您可能想要的是使用访问者模式,或者可能是许多多分派实现中的一种。最终将取决于您。

    【讨论】:

    • 您好,感谢您的回答!在这种情况下,Sprite 是所有实体都拥有并将拥有的东西。我会用什么方法来创建一个虚拟精灵?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以创建一个成员函数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 实例变量。但是,其他海报提出了一个有效的观点。如果所有派生类都有一个,那么将精灵放在基类中可能是有意义的。

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        相关资源
        最近更新 更多