2013-07-06 101 views
1

因此,为了我的下一个游戏,我创建了更好的游戏体系结构的类 我有一个名为GameState的抽象类,并且所有GameState(菜单,窗口,屏幕,游戏本身)都必须继承它以添加到游戏中,但我的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 

这里就是我实现游戏状态构造和BlankStates继承的方法

#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() {} 

在此先感谢您的帮助

的GameState.cpp
+0

什么是你得到确切的错误信息? OMG! –

回答

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

哇,我只是面对如此刻苦....我不敢相信我没有看到...谢谢你先生,因为向我展示了我的方式错误。我知道这是一种愚蠢的行为,这就是我在深夜工作并在早上回来的原因 – Sbot

+0

@Sbot:没有问题,发生在每个人身上;) –

相关问题