2012-04-02 121 views
1

我有一個引擎類,我想設置一個命令。 這是標頭:設置參考C++

class GameEngine 
{ 
public: 
GameEngine(); 
~GameEngine(); 
MoveCommand command; 
void SetCommand(ICommand &); 
void Start(); 
}; 

問題是ICommand。在主我設定

engine.SetCommand(cmdRight); 

其中cmdRightMoveCommand該命令。我不明白setCommand函數中傳遞了什麼。

+0

'MoveCommand'和'ICommand'之間的關係是什麼? – littleadv 2012-04-02 18:47:26

+0

那麼有什麼不明確的? – littleadv 2012-04-02 18:49:42

+0

@littleadv:他不瞭解遺傳。 – 2012-04-02 18:50:26

回答

1

SetCommand需要參照ICommand對象。 (現在,您可以將引用看作是使用不同synax的指針)。假設ICommandMoveCommand的父類,則可以將參考MoveCommand(例如cmdRight)傳遞給GameEngine::SetCommand()。在SetCommand()中,您必須將傳遞參考的類型轉換爲MoveCommand,以便能夠將值分配給command - 否則實際對象可能具有另一個子類型ICommand

試試這個:

void GameEngine::SetCommand(ICommand& cmd) { 
    try { 
    MoveCommand& mcmd = dynamic_cast<MoveCommand&>(cmd); 
    command = mcmd; 
    } catch (const std::bad_cast& e) { 
    std::cout << "Wrong command passed: move command expected" << 
     " (" << e.what() << ")" << std::endl; 
    } 
} 

注意:如果你沒有特別需要在GameEngine一個MoveCommand,你可以聲明ICommand*command並使用傳入通過ICommand接口值。但是,您必須動態分配和取消分配對象,因此如果您不熟悉該主題,請嘗試上面的代碼。

+0

你應該接受答案,如果它解決了你的問題 – Attila 2012-04-02 18:59:20

+0

還在學習,所以謝謝你:D – marktielbeek 2012-04-02 18:59:32

1

ICommand可能是基類,MoveCommand是從ICommand派生的類,所以它使它成爲一個有效的參數。當你想擁有一個泛型函數但不知道你將使用哪一個派生類時,這樣做相當普遍。這SO answer explains about inheritance