在抽象基类中使用静态变量

时间:2015-12-07 14:24:25

标签: c++ inheritance static state-machine

我正在尝试创建一个状态机。我创建了一个名为BaseState的类,所有状态都继承自。{我遇到的问题是,当子类更改BaseState成员变量时,它不会更改所有继承类的变量。根据我所知的编程,这是我使用静态的时候。但在我的情况下,我收到链接器错误(LNK2001)。

因此,当我在ChangeState(State::MenuState);内拨打SplashState时,它会切换,但会切换回来,因为BaseState中的值没有改变。

class StateMachine
{
private:
    State                   _currentState;
    std::vector<BaseState*> _baseStates;
    void ProcessStateRequest();

public:
    StateMachine(InitVar initVar);
    ~StateMachine();

    void Update(float deltaTime);
};

这增加了这样的状态:

StateMachine::StateMachine(InitVar initVar)
{
    _currentState = State::SPLASHSTATE;

    for (int i = 0; i < State::EXITSTATE; i++)
    {
        switch (i)
        {
        case SPLASHSTATE:
        {
            _baseStates.push_back(new SplashState(initVar));
            break;
        }
        case MENUSTATE:
        {
            _baseStates.push_back(new MenuState(initVar));
            break;
        }
        case PLAYSTATE:
        {
            _baseStates.push_back(new PlayState(initVar));
            break;
        }
        case OPTIONSSTATE:
        {
            _baseStates.push_back(new OptionsState(initVar));
            break;
        }
        }
    }
}

改变这样的状态:

void StateMachine::ProcessStateRequest()
{
    //if currentState does not match with the new requested state.
    if (_currentState != _baseStates[_currentState]->GetNewStateRequest())
    {
        _baseStates[_currentState]->OnStateExit();
        _currentState = _baseStates[_currentState]->GetNewStateRequest();
        _baseStates[_currentState]->OnStateEnter();
    }
}

内部basestate.h

enum State
{
    SPLASHSTATE,
    MENUSTATE,
    PLAYSTATE,
    OPTIONSSTATE,
    EXITSTATE,
};

class BaseState
{
private:
    State               _newStateRequest; //Cannot edit this from subclasses. Adding static causes linker error.
protected:
    ObjectHandler*      _objectHandler;
    UIHandler*          _uiHandler;

    void ChangeState(State newState);
public:
    BaseState(InitVar initVar);
    ~BaseState();

    virtual void Update(float deltaTime) = 0;
    virtual void OnStateEnter() = 0;
    virtual void OnStateExit() = 0;

    State GetNewStateRequest()const;
};

basestate.cpp的最后一部分:

BaseState::BaseState(InitVar initVar)
{
    _objectHandler      = initVar.objectHandler;
    _uiHandler          = initVar.uiHandler;
    _newStateRequest    = SPLASHSTATE;
}

BaseState::~BaseState()
{}

void BaseState::ChangeState(State newState)
{
    _newStateRequest = newState;
}

State BaseState::GetNewStateRequest() const
{
    return _newStateRequest;
}

1 个答案:

答案 0 :(得分:0)

麦克卡在评论中给出了这个答案。通过这样做解决了问题;

    public IMongoCollection<OrderModel> StartConnection()
    {

        var client = new MongoClient(connectionString);
        var database = client.GetDatabase("orders");
        //Get a handle on the customers collection:
        var collection = database.GetCollection<OrderModel>("customer_orders");
        return collection;
    }

class BaseState
{
private:
    static State BaseState::_newStateRequest;
    //State             _newStateRequest;