2014-01-11 43 views
-1

我認爲如果我先顯示我的代碼會更好,然後解釋我的問題。返回一個不是指針的映射值的引用

std::map<std::string, SManager> m_managers; 

//SResourceManager is derived from SManager 
SResourceManager& getResourceManager() { return m_managers["resource_manager"]->second; } 

我試圖做的是恢復從SManager參考(這將是SResourceManager的副本),以便能夠在其他地方使用。我知道我可以使用像std :: shared_ptr這樣的東西,但是我寧願不要在這種情況下使用指針,因爲我想讓地圖中的SResourceManager可能發生變化,但是停留在那裏。有沒有辦法把這個值轉換成我實際可以返回的值?

謝謝

+0

爲什麼'秒'返回一個指針:

所以,你可能喜歡的東西結了?除非你顯示'SManager',否則不明顯。 – juanchopanza

+0

對不起,我錯過了。我將編輯帖子。 – Peter

回答

1

「SResourceManager從SManager導出」。從基本類型轉換爲派生類型將需要顯式轉換。

但是,你有一個更大的問題。您的地圖直接包含SManager對象。因此它不會包含SResourceManager對象或任何其他派生類型。無論您編寫哪些代碼來填充該映射,最有可能最終都會切除派生的部分。

如果您想要基本類型的東西可以實際引用派生類型的對象,那麼您需要以某種方式使用指針。 unique_ptr或shared_ptr是合理的選項。

std::map<std::string, std::unique_ptr<SManager>> m_managers; 

SResourceManager& getResourceManager() { return *static_cast<SResourceManager*>(m_managers["resource_manager"].get()); } 
0

它看起來像你使用不正確的語法。如果要假設類型SManager被聲明爲指針,多態類,則函數將通過以下方式

SResourceManager& getResourceManager() { return *m_managers["resource_manager"]; }