Здравствуйте, RainBoy, Вы писали:
RB>Небольшое дополнение
RB>CProblemView::CProblemView()
RB>{
RB> CProblemDoc* pDoc = GetDocument();
RB> ASSERT_VALID(pDoc);
RB>
RB>Вылетает в Assert и в моем и в сгенерированном VS2015 приложении. pDoc используется в конструкторе, но не инициализирован в VS2015
Э-э ... Это вы сами вписали или это сгенерированный студией код в пустом проекте?
Если во View после его создания нужен доступ к документу,то делать это нужно (в вашем случае) в CProblemView::OnInitialUpdate().
Указатель на документ в СView будет вылидным позже. AddView (см. ниже) вызывается после вот этого кода в твоём приложении:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CProblemDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CProblemView));
AddDocTemplate(pDocTemplate);
Пока документ и view не будут "связаны" через pDocTemplate или явно через AddView(CView* pView) у документа — ничего не будет.
Код из MFC:
void CDocument::AddView(CView* pView)
{
ASSERT_VALID(pView);
ASSERT(pView->m_pDocument == NULL); // must not be already attached
ASSERT(m_viewList.Find(pView, NULL) == NULL); // must not be in list
m_viewList.AddTail(pView);
ASSERT(pView->m_pDocument == NULL); // must be un-attached
pView->m_pDocument = this;
OnChangedViewList(); // must be the last thing done to the document
}
void CDocument::RemoveView(CView* pView)
{
ASSERT_VALID(pView);
ASSERT(pView->m_pDocument == this); // must be attached to us
m_viewList.RemoveAt(m_viewList.Find(pView));
pView->m_pDocument = NULL;
OnChangedViewList(); // must be the last thing done to the document
}