Наследование класса с функцией со статическими членами - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть класс Bullet с функцией draw (). Он хочет передать статический член (объект класса 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);
}

Пуля не имеет элемента спрайта. Как я могу написать это так, чтобы он знал его для классов, которые его наследуют?

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Вы можете сделать спрайт виртуальным.Как то так:

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; }
   // ... 
};
0 голосов
/ 09 декабря 2011

Если Bullet является (или может быть) абстрактным, тогда вы можете иметь чисто виртуальную функцию:

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

Тогда каждый унаследованный класс реализует этот метод. Но если они все выполняют одну и ту же работу (и должны иметь спрайт), то спрайт принадлежит Bullet и может быть доступен с помощью getter:

strut Bullet
{
    SDL_Surface* get_sprite () { return sprite; }
}
0 голосов
/ 09 декабря 2011

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...