关于C++类静态成员在Delphi中实现的思考

关于C++类静态成员在Delphi中实现的思考

  没有用过Version 7 以后的Delphi版本,即便5、6、7版本,我也不能够说了解较深。因此,本文可能杞人忧天。
  一、为什么需要静态成员
   比如:一个类,常常需要创建多个对象,我们经常需要得到这些对象的Count;再如:在类似链表中,我们需要标识它的头部。这些信息,都需要供给所有对 象共享(甚至类)。不可能把信息放到类中去,因为类不占有内存空间;不能够用全局变量,这将破坏类的封装;如果放到对象中去,又显然不现实:当某一个对象 发生改变时,要逐一对同类的其他对象进行修改,这不现实。
  二、C++如何实现静态成员
  C++中,用static关键字声明成员为静态成员,并在类的外部给该成员赋初值。由于成员被声明为protected的,所以,保证了封装的安全性。在此不举例说明了。
  三、Delphi模拟实现C++的类静态成员
   我不认为Delphi的OWner管理机制是解决这个问题的良好途径(当然,OWner并不是专门为了解决这个的)至少,它不直观,责任不明确。下面的 代码,在TForm2类定义的单元的实现部分,声明一个全局变量(注意,在实现部分声明,与在接口部分声明,是完全不同的;又加上这个单元仅仅定义 TForm2这个类,可以保证该全局变量的安全),以及一个类方法,专供处理这个全局变量。

//************ 以下是定义TForm2类的单元Unit2 *********

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure  FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    class function GetCount: integer;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

var
  Count : integer = 0; //这就是“静态成员”,其封装的安全性基本可以保证;初值默认本来就是0

constructor TForm2.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Inc(Count); //每构造一个TForm2类的对象,“静态成员”自增1
end;

destructor TForm2.Destroy;
begin
  Dec(Count); //每析构一个TForm2类的对象,“静态成员”自减1
  inherited Destroy;
end;

class function TForm2.GetCount: integer;
begin
  result := Count; //通过类方法GetCount,可以得到“静态成员”值,哪怕没有创建任何对象
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
 //因为是用了Form类,为了测试析构后“静态成员”的变化,就用了这里的代码做一下辅助
begin
  Action := caFree;
end;

end.

//************ 以下是程序主Form的单元 ************

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(self) do Show; //每点击一次Button1,即创建一个TForm2的对象
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Cnt : integer;
begin
  Cnt := TForm2.GetCount; //随时可以观察现存TForm2类对象的个数
  Caption := Format(‘目前存在TForm2类对象 %d 个‘, [Cnt]);
end;

end.

//据说,Delphi2005及以后版本,支持“静态成员”。不过我没用过Delphi2005及以后版本

时间: 2024-08-03 16:13:26

关于C++类静态成员在Delphi中实现的思考的相关文章

Delphi中TList类应用

在DELPHI中指针最常见的就是和类TLIST结合起来使用.下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识. 代码的功能是使用指针和Tlist来生成一个牌串,并将牌串保存在t_CardInfo中. procedure TForm1.Button1Click(Sender: TObject); const //黑桃,红桃,方块,草花 CardType:array[0..3] of String = ('S','H','D','C'); const //取出的

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以

Delphi对象的秘密:在Delphi中的类实例实际上是指向堆中的类实例数据的3 2位指针

在Delphi中的类实例实际上是指向堆中的类实例数据的32 位指针 当访问对象的域.方法和属性时,编译器会自动产生一些代码来处理这个指针.因此对于新手来说,对象就好像是一个静态变量.这意味着,Delphi无法像C++那样在应用程序的数据段中为类分配内存,而只能在堆中分配内存. 所以Delphi的对象实例需要最后自己调用Free()方法来释放,而不能在作用域结束之后被自动释放

Delphi中线程类TThread实现多线程编程(线程同步技术、Synchronize、WaitFor……)

接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event)与Delphi中的事件有所不同.从本质上讲,Event其实就相当于一个全局的布尔变量.它有两个赋值操作:Set和ReSet,相当于把它设置为 True或False.而检查它的值是通过WaitFor操作进行.对应在Windows平台上,是三个API函数:SetEvent.ResetEvent.WaitForSignalObje

Delphi中Android运行和JNI交互分析

Androidapi.JNIBridge负责和JNI交互.,既然要交互,那么首先就是需要获得JNI的运行环境,Android本身内置的就有一个Java(Dalvik)虚拟机.所以这个第一步就肯定是要这个虚拟机和我们当前的运行线程环境关联.这时候Androidapi.JNIBridge中的TJNIResolver就出场了.GetJNIEnv这个函数就是, [delphi] view plaincopy class function TJNIResolver.GetJNIEnv: PJNIEnv;

Delphi中的消息处理

1.windows的消息驱动体系  在windows系统中,消息传递是实现对乡间通信和控制的主要手段.可以额系统都以消息驱动的方式工作.系统中发生的用户输入操作.显示信息的改变.系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口.所以程序设计的主要任务就是为这些消息的处理设计代码. 在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理.当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

Delphi 中的 procedure of object

其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型的定义,他定义了一个可以在类中使用的函数类型区别于type TMyProc = procedure; TMyEvent 和 TMyProc 都定义了一个函数类型,他们的差别是,TMyProc 不可以用在类中定义事件,TMyEvent 却可以. 如果你想知道问什么,那就需要深入了解事件类型以及函数类型

[转]Delphi中,让程序只运行一次的方法

program onlyRunOne; uses Forms,Windows,SysUtils, Dialogs, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var myMutex:HWND; begin myMutex:=CreateMutex(nil,false,'11111'); //名称只能全系统唯一. if WaitForSingleObject(myMutex,0)<>wait_TimeOut then begin Application.I