2016-10-20 25 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,这几乎肯定比原始指针更可能是正确的,因为他的向量当前拥有这些对象。 –