当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .