关于对话框应用程序中的变量应在何处进行初始化的问题

本人建议在OnInitDialog()函数中初始化成员变量,尽量不要在构造函数中初始化。

如:创建对话框应用程序并生成"CCalculatorDlg"类,继承于"CDialog"类。

该问题基于"CCalculatorDlg"类来进行说明:

在CCalculatorDlg类中定义了double m_data和CEdit *m_pEdit两个成员变量

1.在CCalculatorDlg()构造函数或者OnInitDialog()函数中都可以对这两个变量进行如下初始化:

m_data=0;

m_pEdit=NULL;

2.可以在OnInitDialog()函数中进行如下初始化:

m_data=0;

m_pEdit=(CEdit *)this->GetDlgItem(IDC_EDIT);//IDC_EDIT为对话框中的CEdit控件ID

3.在CCalculatorDlg()构造函数中如果进行如下初始化:

m_pEdit=(CEdit *)this->GetDlgItem(IDC_EDIT);//IDC_EDIT为对话框中的CEdit控件ID

则会在生成"Debug解决方案"时报错,而在生成"Release解决方案"时不会报错。

在生成"Debug解决方案"时所报的错:

Debug Assertion Failed!

Program:...

File:...\winocc.cpp

Line:92

打开winocc.cpp并跳至第92行

 CWnd* CWnd::GetDlgItem(int nID) const { ASSERT(::IsWindow(m_hWnd));//此为第92行 if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); }

该语句断言m_hWnd是否为窗体句柄,只在生成"Debug解决方案"时执行该语句,而生成"Release解决方案"时跳过该断言宏。

至于它为什么会报错我是这样子理解的:在生成CCalculatorDlg对话框并调用CCalculatorDlg()构造函数时其基类CWnd中的m_hWnd还为来得及初始化(即m_hWnd==NULL),因此执行第92行的断言肯定会出错,因此最好把此类的初始化放在OnInitDialog()中。

转载于:https://www.cnblogs.com/wackelbh/archive/2009/12/03/1984072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值