2014-08-31 239 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++中使用內部類。