error C2039: classCMenuDlg : is not a member of CMenuDlg

error C2039: classCMenuDlg : is not a member of CMenuDlg

2012年10月11日  ⁄ 综合 ⁄ 共 1222字 ⁄ 字号  小 中 大  ⁄ 评论关闭

事件回放:

1、在MFC下编写的.exe可执行程序在打包的时候由于在未安装vc编译器或微软软件运行环境vcredistx86.exe下无法运行,总是报错说是什么什么并行环境配置有错,程序无法运行等类似的错误提示,解决这一问题最好的方法就是将程序设置为: USE MFC IN  A STATIC LIBRARY.

但是一旦将程序设置为如此后,就会出现error C2039: classCMenuDlg : is not a member of CMenuDlg。

2、在做一个视图分割的例子,自己用基于CSplitterWnd编写的一个自定义类;
当利用成员函数创建视图时:
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
  DECLARE_DYNCREATE(CMenuDlg) //允许动态创建,默认是不允许的

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

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个问题都解决了,希望对你有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值