gpt4 book ai didi

c++ - 使用 C++ 解决状态模式中的循环依赖

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:45 26 4
gpt4 key购买 nike

我正在尝试用 C++ 实现状态模式,但遇到循环依赖问题。我在这里阅读了其他相关 Material - 不幸的是它对我没有帮助。我对 C++ 没有太多经验,所以请多多包涵。以下代码是在 Eclipse Helios CDT 中的 Ubuntu 10.10 机器上开发的:

ConcreteSystem.h

#ifndef CONCRETESYSTEM_H_
#define CONCRETESYSTEM_H_

class SystemState;

class ConcreteSystem {
public:
ConcreteSystem();
void SelfTestFailed();
void Restart();
private:
friend class SystemState;
SystemState *currentState;
void ChangeState(SystemState *state);
};

#endif /* CONCRETESYSTEM_H_ */

混凝土系统.cpp

#include "ConcreteSystem.h"
#include "SystemState.h"

ConcreteSystem::ConcreteSystem() {
currentState = SelfTest::GetInstance();
}

void ConcreteSystem::SelfTestFailed() {
currentState->SelfTestFailed(this);
}

void ConcreteSystem::Restart() {
currentState->Restart(this);
}

void ConcreteSystem::ChangeState(SystemState *state){
currentState = state;
}

系统状态.h

#ifndef SYSTEMSTATE_H_
#define SYSTEMSTATE_H_

class ConcreteSystem;

class SystemState {
public:
virtual void Restart(ConcreteSystem *cs);
virtual void SelfTestFailed(ConcreteSystem *cs);
protected:
virtual void ChangeState(ConcreteSystem *cs, SystemState *state);
};

#endif /* SYSTEMSTATE_H_ */

系统状态.cpp

#include "SystemState.h"
#include "ConcreteSystem.h"

void SystemState::Restart(ConcreteSystem *cs) {

}

void SystemState::SelfTestFailed(ConcreteSystem *cs) {

}


void SystemState::ChangeState(ConcreteSystem *cs, SystemState *state) {
cs->ChangeState(state);
}

SelfTest.h

#ifndef SELFTEST_H_
#define SELFTEST_H_

#include "SystemState.h"


class SelfTest : public SystemState {
public:
SelfTest();
void SelfTestFailed(ConcreteSystem* cs);
static SystemState* GetInstance();
private:
static SystemState* instance;
};

#endif /* SELFTEST_H_ */

SelfTest.cpp

#include "SelfTest.h"
#include "Failure.h"

SystemState* SelfTest::instance = 0;

SelfTest::SelfTest() {

}

void SelfTest::SelfTestFailed(ConcreteSystem *cs) {
ChangeState(cs, Failure::GetInstance());
}

SystemState* SelfTest::GetInstance() {
if (instance == 0) {
instance = new SelfTest();
}
return instance;
}

失败.h

#ifndef FAILURE_H_
#define FAILURE_H_

#include "SystemState.h"

class SelfTest;

class Failure : public SystemState {
public:
Failure();
void Restart(ConcreteSystem* t);
static SystemState* GetInstance();
private:
static SystemState* instance;
};

#endif /* FAILURE_H_ */

失败.cpp

#include "Failure.h"
#include "SelfTest.h"

SystemState* Failure::instance = 0;

Failure::Failure() {

}

void Failure::Restart(ConcreteSystem* t) {
ChangeState(t, SelfTest::GetInstance());
}

SystemState* Failure::GetInstance() {
if (instance == 0) {
instance = new Failure();
}
return instance;
}

我对包含有问题,这给了我一些奇怪的编译器错误。谁有解决这个问题的好方法?

最佳答案

从您发布的代码来看,您将重新定义类。查看您的 Failure.cpp 文件,您有:

#include "Failure.h"
#include "SelfTest.h"

这将包括这两个文件,并且每个文件都包括 SystemState.h 文件。由于多次包含 SystemState.h 文件,它会尝试重新定义 SystemState 类。在每个头文件的顶部,您应该执行如下操作:

// SystemState.h
#ifndef SystemState_h
#define SystemState_h
.. class definition ..
#endif // close the if statement from above.

作为设计的旁白,我认为状态相互了解是一种不好的形式 - 使用您的 ConcreteSystem 作为状态 Controller ,然后将状态基于最后一个的返回值状态操作。

此外,如果您对 C++ 相对缺乏经验,我会推荐 looking at this作为学习资料的重要来源(当然还有 StackOverflow!)。

关于c++ - 使用 C++ 解决状态模式中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198788/

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