主页
Top.Mail.Ru Yandeks.Metrika
论坛:“抢”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

是否真的不可能用参数描述析构函数类? 找到类似的分支


MaximatorVeter   (2002-07-02 19:15) [0]

有一个类:

//森林作为集合
TForest =类
树:数组的数组THeightClassPine的数组的数组;
网站:TSite;
构造函数Create(运行,年份:单词;种类,类:字节;
SiteHeight,SiteWidth:真实);
析构函数Destoy(运行时间,年:字;种类,类:字节);
结束;

在构造函数中,我创建了一个动态对象数组:

构造函数TForest.Create(运行时间,年:单词;种类,类:字节; SiteHeight,SiteWidth:真实);
VAR
r:单词;
y:单词;
k:字节;
开始
网站:= TSite.Create(SiteHeight,SiteWidth);
SetLength(树木,树木,年份,种类,类);
为r:= 0运行-1做
对于y:= 0至Year-1
对于k:= 0到class-1
开始
树[r,y,0,k]:= THeightClassPine.Create;
树[r,y,1,k]:= THeightClassPine(THeightClassSpruce.Create);
结束;
结束;

在析构函数中,我想释放内存:

析构函数TForest.Destoy(运行时间,年:单词;种类,类:字节);
VAR
r:单词;
y:单词;
k:字节;
开始
为r:= 0运行-1做
对于y:= 0至Year-1
对于k:= 0到class-1
开始
树[r,y,0,k] .Free;
树[r,y,1,k] .Free;
结束;
网站免费;
结束;

尝试访问析构函数时:
Frs:= TForest.Create(10,200,2,11,20,20);
...
如果已分配(Frs),则 Frs.Destroy(10,200,2,11);
我得出的结论是,编译器只知道Frs.Destroy()而没有参数,因为 给出错误消息:实际参数太多。

我需要帮助!



MaximatorVeter   (2002-07-02 19:16) [1]

有一个类:

// Forest as agregation
TForest=class
Trees: array of array of array of array of THeightClassPine;
Site : TSite;
constructor Create(runs, years: word; species, classes: byte;
SiteHeight,SiteWidth:real);
destructor Destoy(runs, years: word; species, classes: byte);
end;


在构造函数中,我创建了一个动态对象数组:

constructor TForest.Create(runs, years: word; species, classes: byte; SiteHeight,SiteWidth:real);
var
r: word;
y: word;
k: byte;
begin
Site:=TSite.Create(SiteHeight,SiteWidth);
SetLength(Trees, runs, years, species, classes);
for r:=0 to runs-1 do
for y:=0 to years-1 do
for k:=0 to classes-1 do
begin
Trees[r,y,0,k]:=THeightClassPine.Create;
Trees[r,y,1,k]:=THeightClassPine(THeightClassSpruce.Create);
end;
end;


在析构函数中,我想释放内存:

destructor TForest.Destoy(runs, years: word; species, classes: byte);
var
r: word;
y: word;
k: byte;
begin
for r:=0 to runs-1 do
for y:=0 to years-1 do
for k:=0 to classes-1 do
begin
Trees[r,y,0,k].Free;
Trees[r,y,1,k].Free;
end;
Site.Free;
end;


尝试访问析构函数时:
Frs:=TForest.Create(10,200,2,11,20,20);
...
if Assigned(Frs) then Frs.Destroy(10,200,2,11);

我得出的结论是,编译器只知道Frs.Destroy()而没有参数,因为 给出错误消息:实际参数太多。

我需要帮助!



Volj   (2002-07-02 19:38) [2]

为什么不简单地这样做:
destructor TForest.Destroy;
var
r: word;
y: word;
k, i: byte;
begin
for r:=0 to High(Trees) do
for y:=0 to High(Trees[r]) do
for i:=0 to High(Trees[r,y]) do
for k:=0 to High(Trees[r,y,i]) do
Trees[r,y,i,k].Free;
Site.Free;
end;



Dimka Maslov   (2002-07-02 19:38) [3]

析构函数不能与参数一起使用。 为了释放内存,必须将传递给构造函数的值另存为类字段:

TForest =类
FRuns,年份:Word;
FSpecies,FClasses:字节;
....
析构者摧毁; 覆盖;
结束;

构造函数TForest.Create(运行时间,年:单词;种类,类:字节; SiteHeight,SiteWidth:真实);
...
开始
FRuns:=运行;
年:=年;
FSpecies:=种;
FClasses:=类;

...
结束;

破坏者TForest.Destoy;
VAR
r:单词;
y:单词;
k:字节;
开始
对于r:= 0到Fruns-1做
对于y:= 0到Fyears-1
对于k:= 0到Fclasses-1
开始
树[r,y,0,k] .Free;
树[r,y,1,k] .Free;
结束;
网站免费;
结束;

并且您需要不直接访问析构函数,而是通过Free方法




MaximatorVeter   (2002-07-02 20:00) [4]

谢谢,这两个答案都是有帮助的。
显然,在这种情况下,您需要按照Volj©的建议进行操作。



Volj   (2002-07-02 20:22) [5]

2MaximatorVeter©:
更多:我忘了
FreeAndNil(Trees);
并检查:也许她和所有THeightClassPine都释放了自己?



MaximatorVeter   (2002-07-02 22:31) [6]


>沃尔杰


键入make Trees:= nil并检查数组元素是否将作为THeightClassPine和THeightClassSpruce类的对象释放?



Anatoly Podgoretsky   (2002-07-02 22:40) [7]

为什么不可能,可能,唯一的缺点是Free方法不能



MaximatorVeter   (2002-07-02 22:47) [8]


>阿纳托利Podgoretsky


毕竟,我表明这在析构函数中不起作用。
仅当您添加将释放内部对象占用的内存的过程时。 我理解正确吗?
真诚。



[NIKEL]   (2002-07-02 23:40) [9]

析构函数不能具有参数-没有将参数传递给远程对象的机制,析构函数的功能应简化为



Anatoly Podgoretsky   (2002-07-02 23:51) [10]

“析构函数必须使用默认的寄存器调用约定。”



Anatoly Podgoretsky   (2002-07-03 00:31) [11]


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;

TTest = class
destructor OtherDestructor(I:Integer; S:string); end;
var
Form1: TForm1;
Test:TTest;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Test := TTest.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Test.OtherDestructor(17,"Ошибка в строке ");
Close;
end;

destructor TTest.OtherDestructor(I:Integer; S:string);
begin
ShowMessage(S+IntToStr(I));
inherited Destroy;
end;

end.



[NIKEL]   (2002-07-03 00:42) [12]

如果按预期使用析构函数....



MaximatorVeter   (2002-07-03 00:47) [13]

你检查了吗? 它对我不起作用。



MaximatorVeter   (2002-07-03 01:10) [14]


>阿纳托利Podgoretsky

对不起,它有效! 谢谢你



Anatoly Podgoretsky   (2002-07-03 15:43) [15]

MaximatorVeter©(03.07.02 00:47)
但是,如何在没有验证的情况下就这个有争议的问题举个例子



Страницы: 1 整个分支

论坛:“抢”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上





内存:0.6 MB
时间:0.03 c
1-95369
进程
2002-07-15 20:07
2002.07.29
运行时生成对象


1-95430

2002-07-16 02:27
2002.07.29
search => StringGrid => flicker:((


1-95404
AFROLOV
2002-07-16 10:00
2002.07.29
如何最好地制作类似于Delphi中的Code Assistant的表单


14-95565
VAleksey
2002-07-04 09:34
2002.07.29
Variants.dcu


3-95202
星云
2002-07-05 14:11
2002.07.29
IB SQL





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский