【问题标题】:Inheriting class with a function, with static members使用函数继承类,具有静态成员
【发布时间】:2012-01-16 07:14:51
【问题描述】:

我有一个具有函数 draw() 的 Bullet 类。它想将静态成员(SDL_surface 类的对象)传递给此函数,但不确定如何正确执行。 我的课:

class AllyBullet: public Bullet
{

        public:

        static SDL_Surface *sprite;
};

class EnemyBullet: public Bullet
{

    public:

        static SDL_Surface *sprite;
};

void Bullet::Draw(SDL_Surface *screen)
{
    DrawSprite(screen,sprite,posX,posY);
}

Bullet 没有精灵成员。我如何编写它以便它知道继承它的类?

【问题讨论】:

  • 我有很多子弹对象,但它们都共享同一个位图。
  • (对不起,我想错了。评论已删除。)

标签: c++ oop class inheritance static


【解决方案1】:

您可以使精灵虚拟化。像这样的:

struct Bullet
{
   virtual Sprite getSprite() const;
   void Draw(SDL_Surface * screen)
   {
      DrawSprite(screen, getSprite(), posX, posY);
   }
   // ...
};

struct  AllyBullet : public Bullet
{
   static Sprite s;
   virtual Sprite getSprite() const { return s; }
   // ... 
};

【讨论】:

  • 我们的答案非常相似 :-) 但是您的答案要求开发人员实现一个函数Bullet::getSprite(),但我们该怎么做呢? Pure virtual 函数就是答案。
  • @AaronMcDaid:我会让 OP 决定是否提供默认值、使函数成为纯虚拟函数,或两者兼而有之。
【解决方案2】:

Bullet 应该指定一个 get_sprite() 方法,该方法必须由 AllyBullet 和 EnemyBullet 实现:

class Bullet {
   virtual SDL_Surface * get_sprite() = 0;
}

具体实现如下

   SDL_Surface * EnemyBullet :: get_sprite() { return sprite; }
   SDL_Surface * AllyBullet :: get_sprite() { return sprite; }

那你就可以了

DrawSprite(screen,get_sprite(),posX,posY);

【讨论】:

    【解决方案3】:

    如果 Bullet 是(或可以是)抽象的,那么您可以拥有一个纯虚函数:

    struct Bullet
    {
        SDL_Surface* get_sprite () = 0;
    }
    

    那么每个继承的类都实现这个方法。但是如果他们都做同样的工作(并且都应该有一个 sprite),那么 sprite 就属于 Bullet 并且可以使用 getter 访问:

    strut Bullet
    {
        SDL_Surface* get_sprite () { return sprite; }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      相关资源
      最近更新 更多