当前位置:编程学习 > 网站相关 >>

RUNTIME及连续错误的解决办法

[/code]今天在做一个视图分割的例子,自己用基于CSplitterWnd编写的一个自定义类;
当利用成员函数创建视图时:
[code]m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMenuDlg),CSize(100,735),pContext)

提示错误如下:


error C2039: classCMenuDlg : is not a member of CMenuDlg


看到这个错误,有遇到的朋友第一反应是没有包含头文件,没错的有两种情况:
(1)没有在MainFrame头文件没有包含CMenuDlg的头文件,只要包含即可;
(2)当你发现已经包含了头文件还是出错,那就属于第二种情况了,我根据自己查找的资料得到:
CDialog类创建时默认是不支持动态创建,而MFC为了使类支持动态创建,设计了一套用宏来实现的动态创建机制,在这套宏中,定义了class+类名的数据成员,也就是你这里的classCMenuDlg,只有支持动态创建的类,才有这些数据成员和相应的操作。而CDialog类是不支持的。因此错误提示中就有classCMenuDlg未定义的提示。
解决办法(自己查看例子总结出来):
在CMenuDlg类的头文件添加一句即可,添加后为(红色是添加的):


class CMenuDlg : public CDialog
{
// Construction
public:
  CMenuDlg(CWnd* pParent = NULL);   // standard constructor
  [color=#DC143C]DECLARE_DYNCREATE(CMenuDlg) //允许动态创建,默认是不允许的[/color]


添加完就可以了。
可是我发现问题还没有结束,又来了一个错误提示(类似的,当时忘记截图):


ZLLK.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CZLLKDoc::classCZLLKDoc" (?classCZLLKDoc@CZLLKDoc@@2UCRuntimeClass@@B)


这下又蒙了,继续百度,终于解决了,这里直接给出解决方案(具体的原理推荐阅读侯捷老师的《MFC深入浅出》的动态创建机制,方法如下:
在CMenuDlg类的实现cpp文件前面添加以下语句(记住不是在内部)


IMPLEMENT_DYNCREATE(CMenuDlg, CDialog)


ok,2个问题都解决了,希望对你有帮助。
by L4nk0r  2010-2-28

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,