VC2005中Cview和Doc怎么关联起来?

来源:百度知道 编辑:UC知道 时间:2024/05/30 13:55:22
我在工程中新建了两个类CMyView和CMyDoc,基类分别是CView和CDocument。我想把CMyView和CMyDoc关联起来,于是我在CMyView中重写了GetDocument()函数

.h中:
CMyDoc* GetDocument() const;

#ifndef _DEBUG
inline CMyDoc* CMyView::GetDocument() const
{ return reinterpret_cast<CMyDoc*>(m_pDocument); }
#endif

.cpp中:
CMyDoc* CMyView::GetDocument() const
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}

我想这样在CMyView中应用GetDocument()函数应该就可以找到CMyDoc的指针了。

But,编译可以通过,但是运行到ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));这句就报错。

我估计是指针的问题,是不是此时CMyDoc还没有Create?

应该添加哪些语句来解决次问题?
请高人指点下,谢谢

楼主写的代码基本是正确的,那个ASSERT报错多半是应为你的文档和视图没有正确关联。关联文档和视图需要使用CMultiDocTemplate 或者 CSingleDocTemplate ,这个在InitInstance的时候就应该做了。
一般会是这种形式:
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CLearnCGALDoc),//注意文档类型
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CLearnCGALView));//注意视图类型
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);

只有关联了正确的类型那个IsKindOf才会返回TRUE

我以前也遇到过这个问题,具体怎么解答忘啦,当时我是找到CView的GetDocument()找到,看看他的源码怎么写的,这样子我们就不容易出错误。

MFC内置的东西太多,如果不是很熟悉内部的运行机制,出了bug就很难调试出来