2014-08-31 175 views
0

StackOverflow!C++ - 派生类到基类

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

在Java中,我会做这样的:

在我的引擎类,我会要求我目前的状态变量:

State currState = new MainMenuState(); 

然后,如果我想将当前状态为播放状态,我可能只是这样做:

currState = new PlayState(); 

现在,所有我必须做,以确保我的引擎调用正确的状态的更新方法是调用当前状态的更新方法,其我可以做,因为PlayState,MainMenuState和所有其他状态扩展了具有更新方法的State类。

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

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

我仍然需要保持在我的引擎当前状态的基准,但我只是了解了切割问题与基类这样分配一个派生类:

State currState = new State::MainMenuState(); 

所以,如果我正确理解,我无法以Java中的方式将派生类分配给C++中的基类对象。 那么,我该如何保留一个可能保存表示所有不同派生类的值的对象呢?

请让我知道如果你需要从我这里了解更多信息。提前致谢!

+0

的std :: shared_ptr的 currState = ...; – 2014-08-31 17:05:30

+0

什么是shared_ptr?对不起,希望你不介意我的提问。我对C++很陌生。使用shared_ptr赋予常规指针有什么好处? – 13rave 2014-08-31 17:10:46

回答

3

那么你才会遇到,如果你复制的对象切割问题。为了实现你想要的,你应该使用指针和虚拟方法。如果你将赋值类的对象指针赋值给基类指针,你就可以。所以State* currState = new State::MainMenuState();应该工作得很好。

或者像有人评论更现代的方法是使用共享指针:std::shared_ptr<State> currState = std::make_shared<State::MainMenuState>();std::shared_pointer封装裸指针并做参考计数。

+0

谢谢!我会试试:) – 13rave 2014-08-31 17:17:19

+0

哦,等等,如果你有时间的话......当我尝试这个时遇到问题,我得到错误信息“没有可行的转换来自'shared_ptr '到'shared_ptr '“。我能继承我的遗产吗? 在我的.h文件中,我只是将MainMenuState声明为public。它不从任何东西继承。在.cpp中,我指定了“MainMenuState :: public State”类。这是不正确的? – 13rave 2014-08-31 17:22:12

+0

不可以。您必须在头文件的类声明中指定继承。 'class MainMenuState:public State {...}'。 – PovilasB 2014-08-31 17:58:39

0

除了@ PovilasB的回答,您还询问了内部类。您可以在C++中使用内部类,但它不像Java中那样常见。就我个人而言,我不记得我最后一次在C++中使用内部类。