C ++状态机实现循环依赖问题

时间:2015-10-07 10:25:24

标签: c++ state

我正在用c ++做一个状态机的示例实现。我在编译期间遇到有关类的循环依赖的问题。但我不知道如何解决这个问题,我已事先宣布了这些课程,但程序仍然没有编译。非常感谢帮助。

#include <iostream>

using namespace std;

class State;
class NO_CALLS;
class FIRST_INCOMING;
class ALL_CALLS_TERMINATED;
class FIRST_ACTIVE;
class CallsMachine;

class CallsMachine
{
  State *currentState;
  public:
    CallsMachine()
    {
        cout << "CallsMachine"<<endl;
        currentState = new NO_CALLS();
    }
    void setCurrent(State *s)
    {
        currentState = s;
    }
    void acceptCall()
    {
        currentState->acceptCall(this);
    }
    void rejectCall()
    {
        currentState->rejectCall(this);
    }
};

class State
{
  public:
    //These might as well contain blank implementation.

    virtual void acceptCall(CallsMachine *m /*, the second param should be the cCall object*/)
    {
        cout<<"State: acceptCall"<<endl;
    }
    virtual void rejectCall(CallsMachine *m)
    {
        cout<<"State: rejectCall"<<endl;
    }
};

class NO_CALLS: public State
{
  public:
    NO_CALLS()
    {
        cout <<"NO_CALLS"<<endl;
    };
    ~NO_CALLS()
    {
        cout <<"~NO_CALLS"<<endl;
    };
    void incomingCall(CallsMachine *m)
    {
        cout<<"FIRST_INCOMING: acceptCall"<<endl;
        m->setCurrent(new FIRST_INCOMING());
        //delete this;
    }
};

class ALL_CALLS_TERMINATED: public State
{
  public:
    ALL_CALLS_TERMINATED()
    {
        cout <<"ALL_CALLS_TERMINATED"<<endl;
    };
    ~ALL_CALLS_TERMINATED()
    {
        cout <<"~ALL_CALLS_TERMINATED"<<endl;
    };
};

class FIRST_INCOMING: public State
{
  public:
    FIRST_INCOMING()
    {
        cout <<"FIRST_INCOMING"<<endl;
    };
    ~FIRST_INCOMING()
    {
        cout <<"~FIRST_INCOMING"<<endl;
    };
    void acceptCall(CallsMachine *m)
    {
        cout<<"FIRST_INCOMING: acceptCall"<<endl;
        m->setCurrent(new FIRST_ACTIVE());
        //delete this;
    }
    void rejectCall(CallsMachine *m)
    {
        cout << "FIRST_INCOMING: rejectCall"<<endl;
        m->setCurrent(new ALL_CALLS_TERMINATED());
        //delete this;
    }
};

class FIRST_ACTIVE: public State
{
  public:
    FIRST_ACTIVE()
    {
        cout <<"FIRST_ACTIVE"<<endl;
    };
    ~FIRST_ACTIVE()
    {
        cout <<"~FIRST_ACTIVE"<<endl;
    };
    void acceptCall(CallsMachine *m)//The second call it can accept.
    {
        cout<<"FIRST_ACTIVE: acceptCall"<<endl;
        //m->setCurrent(new FIRST_ONHOLD_SECOND_ACTIVE());
        m->setCurrent(new ALL_CALLS_TERMINATED());
        //delete this;
    }
    void rejectCall(CallsMachine *m)
    {
        cout << "FIRST_ACTIVE: rejectCall"<<endl;
        m->setCurrent(new ALL_CALLS_TERMINATED());
        //delete this;
    }
};


int main()
{

}

0 个答案:

没有答案