• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

(转)智能指针的另外一种实现-SmartpointersinDelphi

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Strongly-typed smart pointers are now possible in Delphi, leveraging the work on generics. Here's a simple smart pointer type:

  TSmartPointer<T: class> = record
  strict 
private
    FValue: T;
    FLifetime: IInterface;
  
public
    
constructor Create(const AValue: T); overload;
    
class operator Implicit(const AValue: T): TSmartPointer<T>;
    
property Value: T read FValue;
  
end;

Here it is in action, where TLifetimeWatcher is a little class that executes some code when it dies:

procedure UseIt;
var
  x: TSmartPointer
<TLifetimeWatcher>;
begin
  x :
= TLifetimeWatcher.Create(procedure
  
begin
    Writeln(
'I died.');
  
end);
end;

Here's the full project code that defines TSmartPointer<>, TLifetimeWatcher, and the above test routine:

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TLifetimeWatcher 
= class(TInterfacedObject)
  
private
    FWhenDone: TProc;
  
public
    
constructor Create(const AWhenDone: TProc);
    
destructor Destroy; override;
  
end;

{ TLifetimeWatcher }

constructor TLifetimeWatcher.Create(const AWhenDone: TProc);
begin
  FWhenDone :
= AWhenDone;
end;

destructor TLifetimeWatcher.Destroy;
begin
  
if Assigned(FWhenDone) then
    FWhenDone;
  
inherited;
end;

type
  TSmartPointer
<T: class> = record
  strict 
private
    FValue: T;
    FLifetime: IInterface;
  
public
    
constructor Create(const AValue: T); overload;
    
class operator Implicit(const AValue: T): TSmartPointer<T>;
    
property Value: T read FValue;
  
end;

{ TSmartPointer<T> }

constructor TSmartPointer<T>.Create(const AValue: T);
begin
  FValue :
= AValue;
  FLifetime :
= TLifetimeWatcher.Create(procedure
  
begin
    AValue.Free;
  
end);
end;

class operator TSmartPointer<T>.Implicit(const AValue: T): TSmartPointer<T>;
begin
  Result :
= TSmartPointer<T>.Create(AValue);
end;

procedure UseIt;
var
  x: TSmartPointer
<TLifetimeWatcher>;
begin
  x :
= TLifetimeWatcher.Create(procedure
  
begin
    Writeln(
'I died.');
  
end);
end;

begin
  
try
    UseIt;
    Readln;
  
except
    on E:Exception 
do
      Writeln(E.Classname, 
'', E.Message);
  
end;
end.

 

Update: Fixed capture - was capturing a location in the structure, which of course will be freely copied etc.

 

原帖地址: http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab画图线型、符号及颜色汇总发布时间:2022-07-18
下一篇:
MATLAB绘制饼状图发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap