如何从子项 B 创建子项 A 并转换为父级?

how to create child A from child B and cast to Parent?

本文关键字:转换 创建      更新时间:2023-10-16

上下文:我想利用程序中的状态对象来确定程序在状态期间的运行方式。我有一个抽象类State每个状态都派生自(为了简单起见,假设我们有MenuStateAboutState(,当前状态存储为State类型。

我希望能够从MenuState中创建一个新的AboutState实例,反之亦然,以便我可以控制当前处于的程序状态并轻松更改状态(这将返回一个 State 对象,因为这就是我当前的状态类型(

我遇到的问题显然是,如果我首先创建AboutStateMenuState尚不存在(对编译器而言(并在编译时崩溃。我想通过向前声明MenuState来解决这个问题,但我无法在函数中强制MenuState,因为我只是向前声明它而不是创建一个完整的类。

本质上,我如何转发声明/修复此循环引用问题,以便我可以从另一个对象创建每个对象?

我主要使用 Java,所以请原谅下面的明显错误,但你明白了,即使我转发声明,我也不能投temp->IWorldState。(我认为(

class AboutState : public IWorldState
{
public:
AboutState() {};
virtual IWorldState* handleInput(std::string input) {
MainMenuState temp;
*IWorldState state = (IWorldState)temp;
return state;
}
};
class MainMenuState : public IWorldState
{
public:
MainMenuState() {};
virtual IWorldState* handleInput(std::string input) {
AboutState temp;
*IWorldState state = (IWorldState)temp;
return state;
}
};

也不知道是否可以在同一个问题中提问,但是是否有更合适的方法来对对象执行这种功能,或者是否有不同类型的方法在不同状态之间移动?我考虑过在开始时创建所有状态并将下一个状态作为参数传递给构造函数的想法,但我觉得如果我能让它工作,那就没有必要了。

您必须从定义中拆分(转发(声明:

class IWorldState
{
public:
virtual ~IWorldState() = default;
virtual std::unique_ptr<IWorldState> handleInput(std::string input) = 0;
};
class AboutState : public IWorldState
{
public:
AboutState() = default;
std::unique_ptr<IWorldState> handleInput(std::string input) override;
};
class MainMenuState : public IWorldState
{
public:
MainMenuState() = default
std::unique_ptr<IWorldState> handleInput(std::string input) override
};
// in cpp, else add inline
std::unique_ptr<IWorldState> AboutState::handleInput(std::string input) {
return std::make_unique<MainMenuState>();
}
std::unique_ptr<IWorldState> MainMenuState::handleInput(std::string input) {
return std::make_unique<AboutState>();
}