gpt4 book ai didi

c++ - 如何安全地更改状态对象之间的状态?

转载 作者:太空狗 更新时间:2023-10-29 20:42:10 26 4
gpt4 key购买 nike

我最近发布了一个问题,有人向我指出我错得离谱!

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;
}

状态类(可以有很多):

#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;
}

最佳答案

我认为您遇到的问题是您混淆了状态的行为和状态机的行为;即执行状态行为,而不是管理状态变化。这些应该分开。

您可以有一个类来表示整个状态机。它内部没有任何特定于状态的功能。相反,它将包含指向当前状态对象的指针。 (我假设您所有的个人状态类都派生自一个公共(public)基类。)

当您想要更改状态时,状态机类将删除旧状态并创建和/或存储新状态。各个状态类不应该直接这样做,尽管它们可以调用状态机上的函数来启动更改。

作为旁注,最好避免使用delete this。它在技术上可行,但通常不是一个好主意。

关于c++ - 如何安全地更改状态对象之间的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19687382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com