Error: "Allocating an object of abstract class type" despite all virtual functions being implemented
Error: "Allocating an object of abstract class type" despite all virtual functions being implemented
我收到错误 "Allocating an object of abstract class type '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 中定义。感谢您的帮助!
virtual void handleEvents(SDL_Event* e) = 0;
^
是一个不同于
的原型
void handleEvents(SDL_Event& e);
^
你应该用 override
标记所有被覆盖的函数,然后编译器会为你完成繁重的工作,并告诉你是否搞砸了。
我收到错误 "Allocating an object of abstract class type '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 中定义。感谢您的帮助!
virtual void handleEvents(SDL_Event* e) = 0;
^
是一个不同于
的原型void handleEvents(SDL_Event& e);
^
你应该用 override
标记所有被覆盖的函数,然后编译器会为你完成繁重的工作,并告诉你是否搞砸了。