2013-07-06 4 views
1

Итак, для моей следующей игры я создаю классы, чтобы улучшить архитектуру моей игры. У меня есть абстрактный класс GameState, и все игры GameStates (меню, окна, экран, сама игра) должны наследовать его, чтобы быть добавленным в игру, но мой BlankState, который является испытанием моего дизайна GameState, вызывает у меня проблемы с компилятором, поскольку он по какой-то причине считается абстрактным классом, может ли кто-нибудь сказать мне, почему? Я чувствую, что мне не хватает чего-то действительно очевидного здесь.Почему мой подкласс рассматривается как абстрактный класс?

Вот содержание GameState.h

#ifndef GUARD_GAMESTATE_H 
#define GUARD_GAMESTATE_H 

#include<SDL.h> 

class Game; 

class GameState { 
protected: 
    Game *m_pGame; 
public: 
    GameState(Game& ); 

    virtual void load() = 0; 

    virtual void handle_events(SDL_Event& events) = 0; 
    virtual void logic() = 0; 
    virtual void draw() = 0; 

    virtual void unload() = 0; 

    virtual ~GameState() = 0; 
}; 

class BlankState : public GameState { 
private: 
    SDL_Surface *background; 

public: 

    BlankState(Game& game); 

    void load(); 
    void handle_events(); 

    void logic(); 

    void draw(); 

    void unload(); 

    ~BlankState(); 
}; 

#endif 

А вот GameState.cpp где я реализую конструктор и BlankStates GameState наследуемые методы

#include"GameState.h" 
#include"Game.h" 
#include"AssetLoader.h" 


GameState::GameState(Game& game) { 
    m_pGame = &game; 
    m_pGame->addState(this); 
} 




BlankState::BlankState(Game& game) 
     :GameState(game) 
    {} 


void BlankState::load() { 
     background = AssetLoader::loadImage("assets\background.png"); 
} 

void BlankState::handle_events() {} 

void BlankState::logic() {} 

void BlankState::draw() { 
     SDL_Rect lol; 
     lol.x = 0; 
     lol.y = 0; 
     SDL_BlitSurface(background, NULL, m_pGame->getSurface(), &lol); 
} 

void BlankState::unload() { 
     SDL_FreeSurface(background); 
} 

BlankState::~BlankState() {} 

Спасибо заранее за вашу помощь

+0

Что такое точное сообщение об ошибке вы получаете? –

ответ

5

Функция void handle_events() в производном классе имеет другую подпись, чем функция void handle_events(SDL_Event&) в базовый класс он должен переопределить.

Компилятор жалуется, потому что производный класс не обеспечивает реализацию чистой виртуальной функции void handle_events(SDL_Event&), объявленной в базовом классе.

Другими словами, ваш производный класс является абстрактным, и компилятор правильно отказывается его создавать.

В качестве дополнительного замечания, в C++ 11 вы можете использовать контекстное ключевое слово override прямо заявить о своем намерении сделать функцию члена переопределить виртуальную функцию, объявленную в базовом классе:

struct X 
{ 
    virtual void foo(int) = 0; 
}; 

struct Y : X 
{ 
    virtual void foo(int) override { } 
//      ^^^^^^^^ 
//      Makes it clear that this function is meant to 
//      override (and not just to hide) a virtual function 
//      declared in the base class 
}; 

int main() 
{ 
    Y y; 
} 

Цель из этого можно было легко поймать ошибки, подобные тому, что вы сделали. Пытаясь override функция, подпись не совместим с подписью виртуальной функции в базовом классе будет вызвать ошибку компиляции:

struct X 
{ 
    virtual void foo(int) = 0; 
}; 

struct Y : X 
{ 
    virtual void foo() override { } // ERROR! 
    //     ^^^^^^^^ 
    //     X::foo has an incompatible signature 
}; 

int main() 
{ 
    Y y; 
} 
+0

OMG! Ничего себе, я просто так опасался ... Я не могу поверить, что не видел этого ... Спасибо, сэр, за то, что показал мне ошибку моих путей. Я знал, что это было что-то глупое, вот что я получаю для работы так поздно ночью и возвращаюсь к нему утром – Sbot

+0

@Sbot: проблем нет, бывает со всеми;) –

Смежные вопросы