的StackOverflow!
我来自Java饱和的背景,我第一次尝试使用C ++。我正在编写一个基类来表示游戏状态(暂停状态,播放状态,菜单状态)。 Engine类将保持对状态对象的引用,AKA是当前游戏状态,然后在游戏循环期间调用该状态的update,render和pollInput函数。
在Java中,我会这样做:
在我的Engine类中,我需要当前的状态变量:
State currState = new MainMenuState();
然后,如果我想将当前状态设置为Play状态,我可以这样做:
currState = new PlayState();
现在,我必须做的就是确保我的引擎调用正确状态的update方法是调用当前状态的更新方法,我可以这样做,因为PlayState,MainMenuState和我所有其他状态都扩展了State类,有更新方法。
public void update()
{
currState.update();
}
如何在C ++中执行此类操作?我决定将所有派生类定义为State类中的公共内部类(我喜欢整合代码)。 让内部课程延伸他们的外部课程对我来说是不好的做法吗?
我仍然需要在我的引擎中维护对当前状态的引用,但是我刚刚了解了将派生类分配给基类的切片问题,如下所示:
State currState = new State::MainMenuState();
因此,如果我理解正确,我就不能像在Java中那样将派生类分配给C ++中的基类对象。 那么如何保留一个可能包含代表所有不同派生类的值的对象呢?
如果您需要我提供更多信息,请与我们联系。提前谢谢!
答案 0 :(得分:3)
如果你要复制对象,你只会遇到切片问题。为了实现你想要的,你应该使用指针和虚方法。如果你将derrived类的对象指针分配给基类指针,你就可以了。所以State* currState = new State::MainMenuState();
应该可以正常工作。
或者有人评论说,更现代的方法是使用共享指针:std::shared_ptr<State> currState = std::make_shared<State::MainMenuState>();
。 std::shared_pointer
封装了裸指针,并引用了计数。
答案 1 :(得分:0)
除了@ PovilasB的答案,你还问过内部课程。您可以在C ++中使用内部类,但它不像Java那样常见。就个人而言,我不记得上次我在C ++中使用内部类时。