⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 state.cpp

📁 MARS加密解密
💻 CPP
字号:
// State.cpp: implementation of the CState class.
//
//	本程序是《疯狂的火星虫—面向对象状态机实践指南》的演示程序
//
//	版权所有 (C) 2004 王咏武
//	http://www.contextfree.net/wangyw/
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "State.h"
#include "FSM.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CState::CState(CFSM * pFSM, const char * lpName, const char * lpParent)
    : m_pDefault(NULL), m_pActive(NULL), m_pName(lpName)
{
    if (lpParent)
        m_pParent = pFSM->GetState(lpParent);
    else
        m_pParent = NULL;

    // 第一个加入的为缺省状态
    if (m_pParent && ! m_pParent->m_pDefault)
        m_pParent->m_pDefault = this;
}

/*  从根状态开始,把事件传递给当前所有的活动状态
 *
 */
bool CState::SendEvent(CFSM * pFSM, WORD wEvent, WORD wParam, DWORD lParam)
{
    OnEvent(pFSM, wEvent, wParam, lParam);
    if (m_pActive)
        return m_pActive->SendEvent(pFSM, wEvent, wParam, lParam);
    else
        return false;
}

/*  从目的状态开始,激活目的状态到叶子状态之间的所有缺省子状态
 *  调用这些状态的入口动作,顺序从目的状态到叶子状态,不包括目的状态
 */
void CState::ActiveDefaultChild(CFSM * pFSM)
{
    if (m_pDefault)
    {
        // 调用缺省子状态的入口动作
        m_pDefault->OnEvent(pFSM, EVENT_ENTRY, 0, 0);
        // 激活缺省子状态
        m_pDefault->ActiveDefaultChild(pFSM);
        m_pActive = m_pDefault;
    }
}

/*  从目的状态开始,激活目的状态到根状态之间的所有状态
 *  调用这些状态的入口动作,顺序从根状态到目的状态
 */
void CState::Active(CFSM * pFSM, CState * pStop)
{
    if (this != pStop && m_pParent)
    {
        // 激活父状态
        m_pParent->Active(pFSM, pStop);
        m_pParent->m_pActive = this;
    }
    // 调用自己的入口动作
    OnEvent(pFSM, EVENT_ENTRY, 0, 0);
}

/*  从根状态开始,停止当前所有的活动状态
 *  调用这些状态的退出动作,顺序从叶子状态到根状态
 */
void CState::Deactive(CFSM * pFSM)
{
    if (m_pActive)
    {
        // 停止活动子状态
        m_pActive->Deactive(pFSM);
        m_pActive = NULL;
    }
    // 调用自己的退出动作
    OnEvent(pFSM, EVENT_EXIT, 0, 0);
}

const char * CState::GetActiveLeaf()
{
    CState * pLeaf = this;
    while (pLeaf->m_pActive)
        pLeaf = pLeaf->m_pActive;
    return pLeaf->m_pName;
}

bool CState::IsActive()
{
    if (! m_pParent)
        // 根状态总是活动的
        return true;
    else if (m_pParent->m_pActive == this)
        return true;
    else
        return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -