2016-10-13 4 views
-5

Я получаю сообщение об ошибке «Выделение объекта абстрактного типа класса« MainGame », несмотря на то, что все виртуальные функции реализованы. Ниже приведены соответствующие фрагменты кода:Ошибка: «Выделение объекта абстрактного типа класса», несмотря на то, что реализованы все виртуальные функции.

main.cpp

#include "Gamestate_MainGame.h" 

int main() { 
    Game game; 
    if (game.init(new MainGame)) 
     game.loop(); 
    return 0; 
} 

Gamestate.h

#ifndef Gamestate_h 
#define Gamestate_h 
#include <SDL2/SDL.h> 
#include "Game.h" 

class GameState { 
public: 
    virtual bool init(Graphics* graphics, Game* game) = 0; 
    virtual void quit() = 0; 

    virtual void handleEvents(SDL_Event* e) = 0; 
    virtual void logic() = 0; 
    virtual void render() = 0; 

protected: 
    Game* game = NULL; 
    Graphics* graphics = NULL; 
}; 
#endif 

Gamestate_MainGame.h

#ifndef Gamestate_MainGame_h 
#define Gamestate_MainGame_h 
#include <vector> 
#include <SDL2_mixer/SDL_mixer.h> 
#include "Gamestate.h" 
#include "Graphics.h" 
#include "Tile.h" 

class MainGame : public GameState { 
    // Gamestate Functions 
    bool init(Graphics* graphics, Game* game); 
    void quit(); 

    void handleEvents(SDL_Event& e); 
    void logic(); 
    void render(); 

    // MainGame functions - make private? 
    void makeTiles(); 
    void loadPositions(const int & n); 
    void scrambleTiles(std::vector<Tile> t); 
    void restart(); 

    bool isSolved(); 
    bool isNeighbor(const Tile& a, const Tile& b); 
    int getClickedTile(const int& x, const int& y); 

private: 
    Game* game = NULL; 
    Graphics* graphics = NULL; 

    int clickedTile { -1 }; 
    int clicks  { 0 }; 
    bool gameExit { false }; 
    bool gameWin  { true }; 
    bool catMode  { true }; 

    std::vector<Tile> tiles; 
    std::vector<SDL_Rect> positions; 

    Mix_Chunk* click = NULL; 

}; 
#endif 

Game.h

#ifndef Game_h 
#define Game_h 
#include <vector> 
#include <SDL2/SDL.h> 
#include "Graphics.h" 

class GameState; 

class Game { 
public: 
    Game(); 

    bool init(GameState* state); 
    void loop(); 

    void pushState(GameState* state); 
    void popState(); 
    void setQuit(); 
private: 
    bool quit { false }; 

    Graphics graphics; 
    SDL_Event event; 
    std::vector<GameState*> states; 

    Uint32 new_time; 
    Uint32 old_time; 

    //internal loop functions 
    void update(); 
    void render(); 

    void quitGame(); //will free SDL resources and perform cleanup of states 
}; 
#endif 

Все функции MainGame определены в Gamestate_MainGame.cpp. Спасибо за помощь!

+6

handleEvent in MainGame не переоценивается – Raindrop7

+1

Не связано с вашей проблемой, но вы * переопределяете * переменные-члены 'game' и' graphics' в дочернем классе. Поскольку базовый класс в противном случае является чистым абстрактным классом, он не должен иметь никаких переменных-членов. –

ответ

6
virtual void handleEvents(SDL_Event* e) = 0; 
           ^

является другим прототипом, чем

void handleEvents(SDL_Event& e); 
         ^

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