2016-10-20 6 views
1

В конструкторе одного из моих классов У меня есть эта строка:Попытка указателя обратного приведения объекта в станде :: вектор

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 возвращает нулевое значение, но, как я понимаю, cast должен работать, поскольку m_Current является указателем на первый элемент 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_ptr или shared_ptr.

Как прокомментировал Марк Рэнсом, см What is object slicing?

+0

Точно так. Найдите «срез объектов», чтобы понять больше. –

+0

Спасибо вам обоим. Я не думал о копировании моих объектов. Когда я смотрю ближе в отладчике, я теперь это понимаю (расширение вектора показывает строго некоторые объекты базового класса). – DreamTool

+0

Должно, по крайней мере, упомянуть уникальный ptr, это почти наверняка будет правильным, чем исходные указатели, потому что его вектор в настоящее время принадлежит объектам. –

Смежные вопросы