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

そして、これが GameState コンストラクターと BlankStates 継承メソッドを実装する GameState.cpp です。

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

よろしくお願いいたします。

4

1 に答える 1

5

派生クラスの関数は、オーバーライドするはずの基本クラスvoid handle_events()の関数とは異なる署名を持っています。void handle_events(SDL_Event&)

void handle_events(SDL_Event&)派生クラスが基本クラスで宣言された純粋仮想関数の実装を提供しないため、コンパイラは不平を言っています。

つまり、派生クラスは抽象クラスであり、コンパイラはインスタンス化を正しく拒否します。

追加の注意として、C++11 では contextual キーワードを使用し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;
}
于 2013-07-06T15:53:40.287 に答える