C++标准库auto_ptr指针的应用

在进行学习windows编程的时候,要使用大量的API和消息对控件进行操作,虽然很烦乱,但是对于学习和研究还是很有用处的。

虽然以前学了一点的MFC,但是对于MFC的使用其实是一知半解,也没有入门。

现在重新使用C++的方法进行SDK的封装学习,对于自己是一个很好的兴趣点。

之前,一直没有好好学下C++,感觉好像用不到。因为在MFC中,放一个按钮,双击一下,一个函数自动生成了。

我感觉这样的方法对我的学习没有好处。

还是从基础的SDK进行学习吧,将学到的C++知识用起来。

今天封装了几个很常的控件类:

TButton

TEdit

TListBox

TCombox;

将这些常用控件按照MFC的格式全部封装,在写程序时方便多了。不用老是查找MSDN说明,省了不少事。

问题出现了。我在TForm窗口中有很多的控件成员类

private://成员控件对象 TButton* cmdOK; TCheckBox* chkTest; TRadioBox* radTest; TButton* cmdTest; TEdit* editTitle; TButton* cmdCobox; TCombox* cobTest; TListbox* lbTest; TButton* cmdLbox;

这么多的控件成员,我要在函数中进行初始化,例:

//控件成员初始化 // LRESULT UMain::OnInitalize(WPARAM wp,LPARAM lp) { //OnInitComponet(); cmdOK = new TButton(_hwnd,IDCANCEL); chkTest = new TCheckBox(_hwnd,WIN_CHECK_TEST1); radTest = new TRadioBox(_hwnd,WIN_RADIO1); cmdTest = new TButton(_hwnd,WIN_BUTTON_TEST); editTitle = new TEdit(_hwnd,WIN_EDIT1); cmdCobox = new TButton(_hwnd,WIN_BUTTON_COMTEST); cobTest = new TCombox(_hwnd,WIN_COMBO1); lbTest = new TListbox(_hwnd,WIN_LIST1); //cmdLbox = new TButton(_hwnd,WIN_BUTTON_LISTBOX); //调用数据初始化 return OnInitWorkData(); }

窗口退出时,还要进行一个消毁内存的操作,

//烧毁控件成员 // LRESULT UMain::OnUnInitalize() { delete cmdOK; delete radTest; delete cmdTest; delete editTitle; delete cmdCobox; delete cobTest; delete lbTest; }

要写这么多的代码,我感觉自己好业余啊。我很担心,要是中途出错了。我的OnUnInitalize函数没有执行,omg,什么破程序啊。发现这个问题,我感觉好郁闷啊。异常也知道如何处理,我感觉能捕获的异常,我没有必要捕获了,我要捕获的是那种不能捕获的异常,比如buff溢出之类,内存越界之类的事情。现在弄得异常处理都不想去学了。 百无聊懒,在看书的过程中发现<c++标准库>中有一个好东西, auto_ptr,只是神助也,有了这个东西,我不可以不用多写一堆的代码删除new出来的指针了。将原来的TButton* chkTest;这样的定义改成auto_ptr<TButton> cmdTest类型,在类消毁的时候,这个指针对应的东西也会消毁掉吧?修改后的初始化函数,

//控件成员初始化

// LRESULT UMain::OnInitalize(WPARAM wp,LPARAM lp) { //OnInitComponet(); auto_ptr<TButton>ptr (new TButton(_hwnd,IDCANCEL)); cmdOK = ptr; auto_ptr<TCheckBox>ptrchkTest (new TCheckBox(_hwnd,WIN_CHECK_TEST1)); chkTest = ptrchkTest; auto_ptr<TRadioBox>ptrradTest(new TRadioBox(_hwnd,WIN_RADIO1)); radTest = ptrradTest; auto_ptr<TButton>ptrcmdTest (new TButton(_hwnd,WIN_BUTTON_TEST)); cmdTest = ptrcmdTest; auto_ptr<TEdit>ptreditTitle(new TEdit(_hwnd,WIN_EDIT1)); editTitle = ptreditTitle; auto_ptr<TButton>ptrcmdCobox(new TButton(_hwnd,WIN_BUTTON_COMTEST)); cmdCobox =ptrcmdCobox; auto_ptr<TCombox>ptrcobTest(new TCombox(_hwnd,WIN_COMBO1)); cobTest = ptrcobTest; auto_ptr<TListbox>ptrlbTest(new TListbox(_hwnd,WIN_LIST1)); lbTest = ptrlbTest; auto_ptr<TButton>ptrcmdLbox(new TButton(_hwnd,WIN_BUTTON_LISTBOX)); cmdLbox = ptrcmdLbox; return OnInitWorkData(); }

问题又来了,本打算auto_ptr<TButton>cmdTest (new TButton(_hwnd,IDCANCEL));直接定义我的按钮指针,事于愿反,发现只要离开这个函数,我的cmdTest指针也消毁掉了。这也太不智能了。只好弄个临时变量转存一下。至少,有了这一招,我不用去delete我的成员对象了。实例化函数,还要改进,还没有想到好的办法,总觉得写这么一大堆的代码,太业余了。。。。郁闷,刚刚接触auto_ptr,还不知道如何用。郁闷中。。。

。。。。原来是书没有看完,就上马了。这下知道如何定义一个auto_ptr后进行赋值了。

例:auto_ptr(TButton)ptrButtonOk;

ptrButtonOk = auto_ptr(TButton)(new TButton(_hwnd,IDC_BUTTON1));//这样就可以正确赋值。不用临时转存了。


好东西,写在这里备忘,好好掌握,临活运用。C++STL还有很多的好东西等着我呢。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值