先来实现 TMyList.SetCapacity.

马上会想到下面代码:


procedure TMyList.SetCapacity(const Value: Integer);
beginif FCapacity <> Value thenFCapacity := Value;
end;

但这样是远远不够的, 关键是需要分配内存, 像这样: ReallocMem(数组的起点指针, 元素个数*元素大小);

数组的起点指针即是 FList; 元素个数就是 SetCapacity 的参数: Value; 元素即是指针, Win32 指针的大小是 4 个字节, 因此可以写为: ReallocMem(FList, Value*4);

在 Win64 下的指针还会是 4 个字节吗? 还是这样写稳妥些: ReallocMem(FList, Value*SizeOf(Pointer));

把方法改写为:


procedure TMyList.SetCapacity(const Value: Integer);
beginif FCapacity <> Value thenbeginReallocMem(FList, Value * SizeOf(Pointer));FCapacity := Value;end;
end;

这还不够, 如果用户设置的 Value 值大于了列表的最大许可值(MaxListSize)怎么办? 小于了当前的元素数也不行啊, 再改写:


procedure TMyList.SetCapacity(const Value: Integer);
beginif (Value < FCount) or (Value > MaxListSize) thenExit;if FCapacity <> Value thenbeginReallocMem(FList, Value * SizeOf(Pointer));FCapacity := Value;end;
end;

莫名其妙地 Exit, 会让人摸不着头脑, 抛出个异常吧(使用异常类需要 uses SysUtils 单元), 譬如:


if (Value < FCount) or (Value > MaxListSize) thenraise Exception.Create('非法的数据');

再具体点, 让异常说出非法数据到底是什么:


if (Value < FCount) or (Value > MaxListSize) thenraise Exception.CreateFmt('非法数据:%d', [Value]);

TList 把抛出异常也做成了一个 Error 方法, 我们暂时就这样吧, 再次改写方法为:


procedure TMyList.SetCapacity(const Value: Integer);
beginif (Value < FCount) or (Value > MaxListSize) thenraise Exception.CreateFmt('非法数据:%d', [Value]);if FCapacity <> Value thenbeginReallocMem(FList, Value * SizeOf(Pointer));FCapacity := Value;end;
end;

TMyList.SetCapacity 方法完成了, 现在完整的代码是:


unit MyList;interfaceuses SysUtils; {异常类 Exception 声明在 SysUtils 单元}constMaxListSize = Maxint div 16;typePPointerList = ^TPointerList;TPointerList = array[0..MaxListSize - 1] of Pointer;TMyList = class(TObject)privateFList: PPointerList;FCount: Integer;FCapacity: Integer;procedure SetCapacity(const Value: Integer);procedure SetCount(const Value: Integer);publicdestructor Destroy; override;function Add(Item: Pointer): Integer;procedure Clear;procedure Delete(Index: Integer);property Capacity: Integer read FCapacity write SetCapacity;property Count: Integer read FCount write SetCount;property List: PPointerList read FList;end;implementation{ TMyList }function TMyList.Add(Item: Pointer): Integer;
beginend;procedure TMyList.Clear;
beginend;procedure TMyList.Delete(Index: Integer);
beginend;destructor TMyList.Destroy;
beginClear;inherited;
end;procedure TMyList.SetCapacity(const Value: Integer);
beginif (Value < FCount) or (Value > MaxListSize) thenraise Exception.CreateFmt('非法数据:%d', [Value]);if FCapacity <> Value thenbeginReallocMem(FList, Value * SizeOf(Pointer));FCapacity := Value;end;
end;procedure TMyList.SetCount(const Value: Integer);
beginend;end.

学习 TList 类的实现[5]相关推荐

  1. 学习 TList 类的实现[6]

    实现 TMyList.Add 函数. TList 中的 Add 函数用到了一个 Grow 方法, 它的原理是元素越多就为以后准备更多内存, 我们这里省略为预留 4 个元素的内存; TList 中的 A ...

  2. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

  3. java中蛇的属性有哪些_学习Java类的属性

    学习Java类的属性-武汉北大青鸟 Public.private.protected显示了三种类中的属性和服务的类型,public是可以随意访问的.private是外界不能访问的(显示了数据的封装性) ...

  4. 普通话测试软件测分准吗,普通话学习测试类 | 普通话测试APP,能做到测试、学习提高两不误吗?...

    原标题:普通话学习测试类 | 普通话测试APP,能做到测试.学习提高两不误吗? 普通话是如今人们生活的常用语言,但要说到参加普通话测试,如果没有提前了解普通话测试的形式与要求,也不知道自己普通话的起步 ...

  5. 学信息安全买计算机,大学学习计算机类信息安全方向真的很蠢吗?

    大学学习计算机类信息安全方向真的很蠢吗? 本人2018届高考党,目前水平可以上一个不错的211,望借自主招生冲击985院校. 几天前,当我对老师说:"我目前最优先的选择是计算机-信息安全方向 ...

  6. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  7. Java为枚举类创建成员变量_Java学习——枚举类

    Java学习--枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  8. 2020-用多通道卷积神经网络学习单类特征用于人脸表现攻击检测

    2020年,Anjith George等人,期刊:TIFS,CCFA刊,Learning One Class Representations for Face Presentation Attack ...

  9. 游戏策划学习:类银河恶魔城、烬

    游戏策划学习:类银河恶魔城.烬 1.roguelike和银河恶魔城类游戏的区别 (1).地图复用是银河恶魔城类非常重要的一个特征.通过剧情导向和收集要素,让玩家多次探索同一个地图区域,用有限的资源延长 ...

最新文章

  1. 【python开源项目】推荐一款prize万能抽奖小工具发布
  2. python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图
  3. oracle 物化视图 ORA-23413: 表 xxx.xx 不带实体化视图日志
  4. 2018.7.6 TX射频调试-PP
  5. NOD32最新升级ID
  6. 金和oa:自定义表单函数计算一段时期内的工作日
  7. 1079 Total Sales of Supply Chain(甲级)
  8. js获取可视区域高度
  9. ip,netstat命令案例
  10. matlab斑点噪声算法,粒子滤波算法中的噪声问题
  11. 渝粤题库 陕西师范大学 《教育社会学》作业
  12. 推荐一款微信小程序《诗词万卷》
  13. 2017 CCPC 秦皇岛 G题
  14. [CodeForces] 274E Mirror Room
  15. 【51nod 1538】一道难题(常系数齐次线性递推)
  16. 单调栈及单调栈的应用
  17. 使用密钥方式登录阿里云服务器
  18. 中国音乐史记•黄家驹列传
  19. ESP32 Arduino TM1638 数码管 按键 LED
  20. 我们如何研发了世界上最酷的调车内燃机车自动驾驶系统

热门文章

  1. linux splash qt,ubuntu14.04 splash安装
  2. 选择之后触_如果有朋友在做选择时左右为难,我应该该给出什么样的建议
  3. dynamo方程怎么写_根据以下说明,画出因果关系图,建立流图模型,并拟定变量名称和适当数据,写出对应的...
  4. gets会读取回车键吗_Linux Shell 读取从键盘输入的数据
  5. 是把计算机分析和恢复力实测,土木工程测试试题.docx
  6. mysql不具有的特征是_MySQL中的SQL特征(转)
  7. [UE4]C++实现动态加载的问题
  8. 真的有能开光追的手游了!自带实机演示的那种,OPPO这次玩“大”了
  9. 机器狗常州巡逻防疫,喊话“不扎堆不聚集”,网友:给孩子安个狗头吧
  10. 可以装在手机里的3D姿态估计,模型尺寸仅同类1/7,平均关节位置误差却只有5厘米 | CPVR 2021...