<b>让TList范例安全</b>[VC/C++编程]
本文“<b>让TList范例安全</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在VCL中包含有一个TList类,相信很多朋友都利用过,它可以便利的保护对象指针,所以很多朋友都喜好用它
来实现控件数组.不幸的是,这个TList类有一些问题,此中最重要就是贫乏范例安全的支持.
这篇文章介绍若何从TList派生一个新类来实现范例安全,并且能自动删除对象指针的办法.
TList的问题所在
关于TList的便利性这里就不多说,我们来看一下,它到底存在什么问题,在Classes.hpp文件中,我们可以看到函数的原型是这样申明的:
int __fastcall Add(void * Item);
编译器可以把任何范例的指针转换为void*范例,这样add函数便可以接纳任何范例的对象指针,这样问题就来了,假如你仅保护一种范例的指针大概还看不到问题的潜在性,下面我们以一个例子来阐明它的问题所在.假定你想保护一个TButton指针,TList当然可以完成这样的工作但是他不会做任何范例查抄确保你用add函数增添的一定是TButton*指针.
TList *ButtonList = new TList; // 成立一个button list
ButtonList->Add(Button1); // 增添对象指针
ButtonList->Add(Button2); //
ButtonList->Add( new TButton(this)); // OK so far
ButtonList->Add(Application); // Application不是button
ButtonList->Add(Form1); // Form1也不是
ButtonList->Add((void *)534);
ButtonList->Add(Screen);
上面的代码可以通过编译运行,因为TList可以接纳任何范例的指针.
当你试图引用指针的时刻,真正的问题就来了:
TList *ButtonList = new TList;
ButtonList->Add(Button1);
ButtonList->Add(Button2);
ButtonList->Add(Application);
TButton *button = reinterpret_cast<TButton *>(ButtonList->Items[2]);
button->Caption = "I hope it's really a button";
delete ButtonList;
相信你已经看到了问题的所在,当你需求获得指针引用的时刻TList并不知道那是个什么范例的指针,所以你需求转换,但谁能保证ButtonList里一定是Button指针呢?你大概会即刻想到利用dynamic_cast来举行转化.
不幸再次到临,dynamic_cast无法完成这样的工作,因为void范例的指针不包含任何范例信息,这意味着你不能利用这样的办法,编译器也不答应你这样做.
dynamic_cast不能利用了,我们唯一的办法就是利用reinterpret_cast,不过这个操作符同从前c的强迫范例转换没有任何辨别,它老是不会失利,你可以把任安在任何指针间转换.这样你就没有办法知道List中能否真的是我们需求的Button指针.在上面的代码片断中,问题还不是非常严重,我们试图转换的指针是Application,当我们改变Caption属性的时刻,最多把标题栏的Caption属性改了,但是假如我们试图转换的对象没有呼应的属性呢?
TList的第二个问题是,它自动删除对象指针的功效,当我们析构TList的时刻,它并不能自动释放保护的指针数组的对象,很多时刻我们需求用手工的办法来完成这样一件事情,下面的代码片断显示了若何释放他们:
TList *ButtonList = new TList; // create a list of buttons
ButtonList->Add(new TButton(Handle)); // add some buttons to the list
ButtonList->Add(new TButton(Handle));
ButtonList->Add(new TButton(Handle));
ButtonList->Add(new TButton(Handle));
...
...
int nCount = ButtonList->Count;
for (int j=0; j<nCount; j++)
delete ButtonList->Items[j];
delete ButtonList;
以上是“<b>让TList范例安全</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |