您的位置:首页 > 编程语言 > C语言/C++

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

2012-01-15 16:05 281 查看
在进行学习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还有很多的好东西等着我呢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: