账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    两个类交叉引用引起的错误,求看看呀?
    40
    0

    /*================================================================

    • Copyright (C) 2017 Ltd. All rights reserved.
    • FileName:fsm.cpp
    • Author: shrekshen
    • Create-time:2017-12-19 20:18:03
    • Describle:study fsm, reference:http://blog.csdn.net/popy007/...

    *
    ================================================================*/

    include <iostream>

    include <map>

    using namespace std;

    class Fsm;//前置声明
    //首先创建一个gamestate类,它是其他状态类的基类
    enum E_GAME_STATE
    {

    E_INTO_GAME = 0,
    E_PLAY_GAME = 1,
    E_LEFT_GAME = 2

    };

    class GameState
    {

    public:
        virtual ~GameState(){}
        virtual void drive() = 0;
        GameState(Fsm* fsm)
        {
            m_fsm = fsm;
        }
        Fsm *m_fsm;

    };

    //然后添加一个管理这些类的管理类,也就是状态机
    class Fsm
    {

    public:
        void add_state(E_GAME_STATE gameState , GameState *state)
        {
            state_map.insert(pair<E_GAME_STATE, GameState *>(gameState, state));
        }
        
        void switch_state(E_GAME_STATE gameState)
        {
            std::map<E_GAME_STATE, GameState *>::iterator it = state_map.find(gameState);
            current_state = it->second;
            current_state->drive();
        }
    
    protected:
        std::map<E_GAME_STATE, GameState *> state_map;
        GameState *current_state;

    };

    class IntoGameState : public GameState
    {

    public:
        IntoGameState(Fsm *fsm):GameState(fsm)
        {
        
        }
    public:
        virtual void drive()
        {
            cout << "IntoGameState" << endl;
            m_fsm->switch_state(E_PLAY_GAME);
        }

    };

    class PlayGameState : public GameState
    {

    public:
        PlayGameState(Fsm *fsm):GameState(fsm)
        {
        
        }
    
    public:
        virtual void drive()
        {
            cout << "PlayGameState" << endl;
            m_fsm->switch_state(E_LEFT_GAME);
        }

    };

    class LeftGameState : public GameState
    {

    public:
        LeftGameState(Fsm *fsm):GameState(fsm)
        {
    
        }
    
    public:
        virtual void drive()
        {
            cout << "LeftGameState" << endl;
            m_fsm->switch_state(E_INTO_GAME);
        }

    };

    int main(){

    Fsm *fsm = new Fsm;
    GameState *intostate = new IntoGameState(fsm);
    GameState *playstate = new PlayGameState(fsm);
    GameState *leftstate = new LeftGameState(fsm);
    fsm->add_state(E_INTO_GAME, intostate);
    fsm->add_state(E_PLAY_GAME, playstate);
    fsm->add_state(E_LEFT_GAME, leftstate);
    fsm->switch_state(E_LEFT_GAME);

    }

    最近在学习设计模式,写的一个简单的状态机,遇到了这个问题,麻烦各位看看。

    class Fsm;//前置声明
    //首先创建一个gamestate类,它是其他状态类的基类
    enum E_GAME_STATE
    {

    E_INTO_GAME = 0,
    E_PLAY_GAME = 1,
    E_LEFT_GAME = 2

    };

    class GameState
    {

    public:
        virtual ~GameState(){}
        virtual void cycle() = 0;
        virtual void drive()=0;
        GameState(Fsm* fsm)
        {
            m_fsm = fsm;
        }
        Fsm *m_fsm;

    };

    class IntoGameState : public GameState
    {

    public:
        virtual void drive(Fsm *fsm)
        {
            m_fsm = fsm;
            cout << "IntoGameState" << endl;
            m_fsm->switch_state(E_LEFT_GAME);
        }

    };

    class PlayGameState : public GameState
    {

    public:
        virtual void drive(Fsm *fsm)
        {
            m_fsm = fsm;
            cout << "PlayGameState" << endl;
            m_fsm->switch_state(E_LEFT_GAME);
        }

    };

    class LeftGameState : public GameState
    {

    public:
        virtual void drive(Fsm *fsm)
        {
            m_fsm = fsm;
            cout << "LeftGameState" << endl;
            m_fsm->switch_state(E_INTO_GAME);
        }

    };

    //然后添加一个管理这些类的管理类,也就是状态机
    class Fsm
    {

    public:
        add_state(E_GAME_STATE gameState , GameState *state)
        {
            state_map.insert(gameState, state);
        }
        
        switch_state(E_GAME_STATE gameState)
        {
            std::map<E_GAME_STATE, GameState *> it = state_map.find(gameState);
            current_state = it->end();
            current_state->drive(Fsm);
        }
    
    private:
        std::map<E_GAME_STATE, GameState *> state_map;
        GameState *current_state;

    };

    int main(){

    Fsm *fsm = new Fsm;
    GameState *intostate = new IntoGameState(fsm);
    GameState *playstate = new PlayGameState(fsm);
    GameState *leftstate = new LeftGameState(fsm);
    fsm->add_state(E_INTO_GAME, intostate);
    fsm->add_state(E_PLAY_GAME, playstate);
    fsm->add_state(E_LEFT_GAME, leftstate);
    fsm->switch_state(E_LEFT_GAME);

    }

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 几人难应 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部