0

クラス GameState とクラス MainMenuGameState を定義しています。前者は抽象クラスを意図しており、後者はそれを継承しています。しかし、どういうわけか、そのプロパティを上書きできません。

GameState.h

#ifndef _GAME_STATE_H_
    #define _GAME_STATE_H_

#include <SDL2/SDL.h>

class GameState {
    public:
        virtual void loop(Uint32 deltaTime) = 0;
        virtual void render() = 0;
        virtual void event(SDL_Event * event) = 0;

        bool stopRenderPropagation = false;
        bool stopLoopPropagation = false;
};

#endif

MainMenuGameState.h

#ifndef _MAIN_MENU_GAME_STATE_H_
    #define _MAIN_MENU_GAME_STATE_H_

#include "../Game.h"

class MainMenuGameState : public GameState {
    public:
        MainMenuGameState(Game * pGame);

        void loop(Uint32 deltaTime);
        void render();
        void event(SDL_Event * event);

        bool stopRenderPropagation = true;
        bool stopLoopPropagation = true;

    private:
        Game * game;

        int xOffset = 0;
        int yOffset = 0;
};

#endif

そのため、MainMenuGameState オブジェクトをインスタンス化した後、stopRenderPropagationstopLoopPropagationになると予想していましたがtrue、それらはfalse.

また、何らかの理由でコンストラクター内でそれらを上書きすることもできませんでした。

MainMenuGameState::MainMenuGameState(Game * pGame) {
    game = pGame;

    xOffset = rand() % 20;
    yOffset = rand() % 20;

    stopRenderPropagation = true;
    stopLoopPropagation = true;
}

その後、それらはまだ真実です。これが私のコンストラクターの問題なのか、それとも C++ のポリモーフィズムを誤解していたのかはわかりません。

MainMenuGameState のインスタンスが に格納されますがvector<GameState *>、これが問題になる可能性はありますか? 私は次のようにプロパティにアクセスしています:

if(gameStates.begin() != gameStates.end()) {
    std::vector<GameState *>::iterator it = gameStates.end();
    do {
        --it;
    } while(it != gameStates.begin() && (*it)->stopLoopPropagation == false);

    while(it != gameStates.end()) {
        (*it)->loop(deltaTime);
        ++it;
    }
}

ご協力ありがとうございました!

4

3 に答える 3

6

派生クラスは、基本クラスのメンバーと同じ名前の別のメンバーを宣言しているため、基本クラスが「非表示」になっています。

コンストラクターでこれらのメンバーの初期値を受け入れる必要があります。または、変更されないクラスの固定プロパティである場合は、代わりにメンバー関数にする必要があります。

class GameState {
    public:
        ...    
        virtual bool stopRenderPropagation() { return false; }
        virtual bool stopLoopPropagation() { return false; }
};

class MainMenuGameState : public GameState {
    public:
        ...    
        bool stopRenderPropagation() { return true; }
        bool stopLoopPropagation() { return true; }
        ...
};
于 2013-09-24T06:54:48.913 に答える
2

データ メンバー (ブール値) の継承は、メソッドの継承およびオーバーロードと同じようには機能しません。代わりに、ブール値を保護された継承データ メンバー (初期化されていない) として配置し、代わりにそれぞれのサブクラスコンストラクターでそれらを初期化してみてください。

class MainMenuGameState : public GameState {
    public:
        MainMenuGameState(Game * pGame);

        void loop(Uint32 deltaTime);
        void render();
        void event(SDL_Event * event);

    protected:
        bool stopRenderPropagation;
        bool stopLoopPropagation;

    private:
        Game * game;

        int xOffset = 0;
        int yOffset = 0;
};
于 2013-09-24T06:55:36.857 に答える