gpt4 book ai didi

C++——将派生类分配给基类

转载 作者:行者123 更新时间:2023-11-30 02:44:06 25 4
gpt4 key购买 nike

计算器溢出!

我的背景是 Java,这是我第一次尝试 C++。我正在编写一个基类来表示游戏状态(暂停状态、播放状态、菜单状态)。 Engine 类将保持对状态对象的引用,也就是当前游戏状态,然后在游戏循环期间调用该状态的更新、渲染和 pollInput 函数。

在 Java 中,我会这样做:

在我的引擎类中,我需要我的当前状态变量:

State currState = new MainMenuState();

然后,如果我想将当前状态设置为播放状态,我可以这样做:

currState = new PlayState();

现在,要确保我的引擎调用正确状态的更新方法,我所要做的就是调用当前状态的更新方法,我可以这样做,因为 PlayState、MainMenuState 和我的所有其他状态都扩展了 State 类,它有一个更新方法。

public void update()
{
currState.update();
}

我如何在 C++ 中做这样的事情?我决定将所有派生类定义为 State 类中的公共(public)内部类(我喜欢合并代码)。 让内部类扩展它们的外部类对我来说是不好的做法吗?

我仍然需要在我的引擎中维护对当前状态的引用,但我刚刚了解了将派生类分配给基类的切片问题,如下所示:

State currState = new State::MainMenuState();

因此,如果我理解正确的话,我不能像在 Java 中那样在 C++ 中将派生类分配给基类对象。 那么如何保留一个对象,该对象可能包含代表所有不同派生类的值?

如果您需要我提供更多信息,请告诉我。提前致谢!

最佳答案

只有在复制对象时才会遇到切片问题。为了实现你想要的,你应该使用指针和虚方法。如果您将派生类的对象指针分配给基类指针,就可以了。所以State* currState = new State::MainMenuState();应该工作得很好。

或者正如有人评论的那样,一种更现代的方法是使用共享指针:std::shared_ptr<State> currState = std::make_shared<State::MainMenuState>(); . std::shared_pointer封装裸指针,做引用计数。

关于C++——将派生类分配给基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594252/

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