2013-07-06 3 views
1

내 다음 게임에서는 내 게임의 아키텍처를 향상시키기위한 클래스를 만듭니다. GameState라는 추상 클래스가 있으며 모든 게임 상태 (메뉴, 창, 스크린, 게임 자체)는 게임에 추가되어야하지만 내 GameState 디자인의 테스트 인 My BlankState는 컴파일러와 관련하여 문제를 일으킨다. 이유는 무엇인지, 추상 클래스로 간주된다. 왜 그런지 말해 줄 수 있을까? 나는 여기에서 정말로 명백한 무엇인가 놓치고있는 것처럼 느낀다. 여기 하위 클래스가 추상 클래스로 간주되는 이유는 무엇입니까?

는 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 생성자 및 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

당신이 받고있는 정확한 오류 메시지는 무엇입니까 : 누구의 서명 컴파일 오류가 발생하게 기본 클래스에서 가상 함수의 시그니처와 호환되지 않는 기능은 override하려고? –

답변

5

파생 클래스의 void handle_events() 함수의 코드가 void handle_events(SDL_Event&) 함수와 다릅니다. 오버라이드 (override) 할 기본 클래스.

파생 클래스가 기본 클래스에 선언 된 순수 가상 함수 void handle_events(SDL_Event&)의 구현을 제공하지 않기 때문에 컴파일러가 불평합니다.

즉, 파생 클래스는 추상 클래스이고 컴파일러는 올바르게 인스턴스화를 거부합니다.

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; 
} 

목적 : C++ (11) 명시 적으로 멤버 함수가 기본 클래스에서 선언 된 가상 함수를 재정의 만드는 당신의 의도를 상태로 문맥 키워드 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 : 문제 없음, 모두에게 일어난;) –

관련 문제