我最近發表了一個問題,有人指出我會犯錯!如何安全地更改狀態對象之間的狀態?
在main()
我正在做一個狀態,然後將整數傳遞給processState()並基於整數它將改變狀態(通過銷燬狀態並創建一個新狀態的新實例),或保持不變州。
我指出的主要問題是函數void state_t::changeState(state_t * new_state)
。我刪除了「this」,然後指向已刪除的「_state」指針指向新的狀態......現在,我指出,這顯然是一件壞事。
所以問題是:使用不同狀態實現這種狀態切換的最佳方式是什麼?也許_state
需要是一個全局指針指向當前狀態還是一些這樣的?
Main.cpp的:
#include <QCoreApplication>
#include <QDebug>
#include "statemachine.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
state_t *myState = new testState1();
myState = myState->processState(1);
myState = myState->processState(2);
myState = myState->processState(3);
myState = myState->processState(1);
return a.exec();
}
基本類型:
#include "state_t.h"
state_t::state_t(QByteArray stateName) :
name(stateName),
_state(this)
{
qDebug() << this->name << ": Creating state";
}
state_t::~state_t()
{
qDebug() << this->name << ": Deleting state";
qDebug() << endl;
}
void state_t::changeState(state_t * new_state)
{
// Check if the state has changed
if (this != new_state)
{
qDebug() << this->name << ": State changed to: " << new_state->name;
delete this;
_state = new_state;
}
else
{
qDebug() << this->name << ": State un-changed";
}
}
void state_t::unknownStateEventHandler(int event)
{
qWarning() << this->name << ": Unknown event " << event;
}
State類(可以有很多這樣的):
#include "teststate1.h"
testState1::testState1() :
state_t("state1")
{
}
state_t *testState1::processState(int event)
{
qDebug() << name << ": event" << event;
switch (event)
{
case 2:
{
changeState(new testState2());
//changeState_t(testState2);
break;
}
default:
{
unknownStateEventHandler(event);
break;
}
}
return _state;
}
@ScarletAmaranth:這是「所有的冰雹」。我們都會感激人們大喊大叫的時代結束了。 ;) – thokra
@thokra這是一個不愉快的拼寫失敗,謝謝你,我剛剛刪除了評論:) – ScarletAmaranth
@thokra&Scarlet ... lol :) –