类的Create,Destroy疑问! ( 积分: 20 )

  • 主题发起人 主题发起人 seekmzy
  • 开始时间 开始时间
S

seekmzy

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(][:(][:(][:(][:(][:(][:(]
各位大虾,本人初次在delphi完全用面向对象的方法写程序

写了5个类,但是在后来调适的时候老在Create,Destroy这两个地方有错误!!!
请客位大虾说一些关与
写constructor Create
和Destructor Destroy,这两个方法时需要注意哪些地方!!!!最好给个类相互调用的示例代码!谢谢
 
[:(][:(][:(][:(][:(][:(][:(]
各位大虾,本人初次在delphi完全用面向对象的方法写程序

写了5个类,但是在后来调适的时候老在Create,Destroy这两个地方有错误!!!
请客位大虾说一些关与
写constructor Create
和Destructor Destroy,这两个方法时需要注意哪些地方!!!!最好给个类相互调用的示例代码!谢谢
 
create的第一句最好是inherited;
constructor TMyClass.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
.....

end;

而Destroy则必须在最后调用Inherited;
destrucotor Destroy;
begin
....
inherited;
end;
否则创建销毁总是容易出错.还有,你的Destroy拼写错误,你拼写的是Dest[red]or[/red]y,正确的是Dest[blue]ro[/blue]y,名字不对,将可能导致你的析构函数Destory调用后,没法调用父类的Destroy函数完成析构!
 
[:D][:D]不好意思啊!!笔误!程序里面的destroy写的是对的![8D]
[^][^]不过加那两个语句,我都没加!谢谢楼上的大侠!
 
再问一下,能说一些delphi里面的类之间的 友元类在delphi里如何实现![:D][:D][:D]
请大虾再帮忙解决一下!
 
Destructor TTriangle.Destroy;
begin
Point1.destroy

Point2.destroy;
Point3.destroy;
free
//再次释放会不会引起异常;
inherited;
end;
大虾请帮忙看这样写代码,需要在哪里修改一下!
 
如果类不从别的类继承(实际上也就是从TObject继承),
constructor Create
virtual
//virtual表示虚函数,表示可以被子类override;
destructor Destory: virtual;
如果从其它类继承,如:TForm
constructor Create(AOwner: TComponent)
override;
destructor Destory: override;
如果子类想再overload一个函数,则必须加上reintroduce和overload
constructor Create(AOwner: TComponent)
overload
override
//这里的overload必面在override之前.
constructor Create(AOwner: TComponent
AParent: TWinControl)
reintroduce
overload;

例子
unit Unit1;

interface

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

type
Ta = class(TObject)
public
constructor Create
virtual;
destructor Destory
virtual;
procedure aaa
virtual;
end;
tb = class(ta)
public
constructor Create
overload
override;
constructor Create(a: String)
reintroduce
overload;
destructor Destory
override;
procedure aaa
overload
override;
procedure aaa(a: string)
reintroduce
overload;
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
c: tb;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor ta.Create;
begin
end;

procedure ta.aaa;
begin
end;

destructor ta.Destory;
begin
end;

constructor tb.Create;
begin
inherited;
end;

constructor tb.Create(a: String);
begin
inherited create;
end;

destructor tb.Destory;
begin
inherited;
end;

procedure tb.aaa;
begin
inherited;
end;

procedure tb.aaa(a: String);
begin
inherited aaa;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
c:= tb.Create('aaa');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
c.Free;
end;

end.
 
我完全按照各位说的规则去做了
可始终出现如下错误
project project1.exe raised exception class EAccessViolation with message'Access violation at address 0044DCAA in module 'Project1.exe'.Read of address 0000001B'.
到底是怎么回事!!
 
constructor Create;override;
destructor Destroy;override;

Create函数中要先加inherited;继承父类的,然后再添加自己的代码(比方说创建自己
添加的成员对象)
Destroy则相反,先处理完(销毁)自己定义的成员对象,再加inherited;继承父类的方法
释放父类资源。

对你这段代码:
Destructor TTriangle.Destroy;
begin
Point1.destroy

Point2.destroy;
Point3.destroy;
free
//再次释放会不会引起异常;
inherited;
end;
1。再次释放会引起异常的;
2。PointX.destroy;的写法也不是最好的,用PointX.Free好点,因为在Free之前会先检查
PointX对象存不存在,如果存在则调用destroy释放,不存在则不进一步操作。destroy
则是直接销毁对象,所以如果你的成员对象没有创建或程序过程中已经释放,那最后你
再释放就会出错。所以,用Free好一点。我想你的“始终出现如下错误”原因可能就
在这
 
在你的例子里那个Free引起的异常是Point1第二次释放造成的. 如果没有Point1~point3.Destroy的话也会引起异常, 不过那个异常是由于死循环造成的系统资源耗尽而引起的, 估计得几秒后吧.
 
delphi是没有友元类的,不过如果两个类在同一个单元里,是可以互相访问私有变量的。
在释放时先进行判断是一个好习惯。
 
非常感谢各位大虾的指导!再次感谢你们。我想说我爱大富翁!谢谢各位!
 
多人接受答案了。
 
后退
顶部