2016-10-20 95 views
1

在我的班級之一的構造函數我有這樣一行:試圖向下轉換對象的指針的std ::矢量

m_Projects = std::vector<parent_project>(); //m_Projects type is std::vector<parent_project> 
m_Current = nullptr; //m_Current type is parent_project* 

在這同一類的功能,我有這樣一行:

m_Projects.push_back(local_project(TITLE, DEMO, FILE)); //local_project class derives from parent_project class. 

在這同一類的第三個功能我有這行:

m_Current = &m_Projects[0]; 

if (dynamic_cast<local_project*>(m_Current)) 

    SetCurrentProject(dynamic_cast<model::local_univariate::local_univariate_project*>(m_Current)); 

的dynamic_cast的返回一個空值,但據我所知,因爲m_Current是指向m_Projects的第一個元素的指針,所以m_Projects是一個local_project對象。我想我可能會錯過一些東西。

回答

2

據我所知,由於m_Current ...是一個local_project對象,因此演員陣容應該可以工作。

如果vector包含指向parent_project的指針,那麼您會這樣說。但是當它存儲對象時,parent_project拷貝構造函數用於拷貝local_project(TITLE, DEMO, FILE)對象在被插入時(push_back)在容器中,然後容器存儲parent_project而不是local_project。因此m_Current不再是local_project ...

您應該將m_Projects更改爲std::vector<parent_project*>。然後你的動態演員將工作。

m_Projects.push_back(new local_project(TITLE, DEMO, FILE)); 

m_Current = m_Projects[0]; 

確保在清除容器時刪除對象以避免內存泄漏。或者只需使用unique_ptrshared_ptr

作爲Mark Ransom的評論,請參閱What is object slicing?

+0

正是如此。搜索「對象切片」以瞭解更多信息。 –

+0

謝謝你們倆。我沒有想到我的對象被複制。當我在調試器中仔細觀察時,我現在意識到這一點(擴展矢量顯示嚴格的一些基類對象)。 – DreamTool

+0

應該至少提到獨特的ptr,這幾乎肯定比原始指針更可能是正確的,因爲他的向量當前擁有這些對象。 –