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

向下

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


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

Имеется класс:

// 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);
结束;

В конструкторе создаю динамический массив объектов:

constructor TForest.Create(runs, years: word; species, classes: byte; SiteHeight,SiteWidth:real);
VAR
r: word;
y: word;
k: byte;
开始
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
开始
Trees[r,y,0,k]:=THeightClassPine.Create;
Trees[r,y,1,k]:=THeightClassPine(THeightClassSpruce.Create);
结束;
结束;

А в деструкторе хотел бы освободить память:

destructor TForest.Destoy(runs, years: word; species, classes: byte);
VAR
r: word;
y: word;
k: byte;
开始
for r:=0 to runs-1 do
for y:=0 to years-1 do
for k:=0 to classes-1 do
开始
Trees[r,y,0,k].Free;
Trees[r,y,1,k].Free;
结束;
Site.Free;
结束;

при попытке обращения к деструктору:
Frs:=TForest.Create(10,200,2,11,20,20);
...
if Assigned(Frs) then Frs.Destroy(10,200,2,11);
делаю вывод, что компилятор знает только Frs.Destroy() без параметров, т.к. выдает сообщение об ошибке: Too many actual parameters.

我需要帮助!



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() без параметров, т.к. выдает сообщение об ошибке: Too many actual parameters.

我需要帮助!



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 = class
FRuns, FYears: Word;
FSpecies, FClasses: Byte;
....
析构者摧毁; 覆盖;
结束;

constructor TForest.Create(runs, years: word; species, classes: byte; SiteHeight,SiteWidth:real);
...
开始
FRuns:=runs;
FYears:=years;
FSpecies:=species;
FClasses:=classes;

...
结束;

destructor TForest.Destoy;
VAR
r: word;
y: word;
k: byte;
开始
for r:=0 to Fruns-1 do
for y:=0 to Fyears-1 do
for k:=0 to Fclasses-1 do
开始
Trees[r,y,0,k].Free;
Trees[r,y,1,k].Free;
结束;
Site.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]


> Volj


Типа сделать 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]

"Destructors must use the default register calling convention."



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.61 MB
时间:0.029 c
1-95344
KIR
2002-07-18 10:59
2002.07.29
--- |分支无标题| ---


4-95615
MemoryLeak
2002-05-22 05:33
2002.07.29
TskMngr用什么功能来完成这些过程?


6-95481
DikobraZ
2002-05-11 18:18
2002.07.29
套接字错误10057


6-95462
snoup
2002-05-16 20:40
2002.07.29
请帮助如何以编程方式将消息发送到特定的


14-95561
Tahion
2002-06-25 10:15
2002.07.29
如何使表单出现?





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