Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.29;
Скачать: CL | DM;

Вниз

Неужели нельзя описать destructor класса с параметрами?   Найти похожие ветки 

 
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);
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.

I need help!


 
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.

I need help!


 
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;
....
destructor Destroy; override;
end;

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

...
end;

destructor TForest.Destoy;
var
r: word;
y: word;
k: byte;
begin
for r:=0 to Fruns-1 do
for y:=0 to Fyears-1 do
for k:=0 to Fclasses-1 do
begin
Trees[r,y,0,k].Free;
Trees[r,y,1,k].Free;
end;
Site.Free;
end;

и обращаться к деструктору надо не напрямую, а через метод 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]


> Anatoly 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]


> Anatoly Podgoretsky

Извиняюсь, работает! Спасибо!


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

MaximatorVeter © (03.07.02 00:47)
А как же, стал бы я кидать пример на такой спорный вопрос без проверки



Страницы: 1 вся ветка

Текущий архив: 2002.07.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-95313
EugenCFG
2002-07-17 18:47
2002.07.29
Как преобразовать значение ColorValue в строку...???


1-95408
Aric
2002-07-16 12:01
2002.07.29
Insert/Delete/Edit для TreeView


1-95309
AlexAlex
2002-07-16 18:00
2002.07.29
Программное управление положением подписей (Mark) в TChart


4-95594
nester
2002-05-20 23:01
2002.07.29
А если с другой стороны sleep() и микросекундный таймер?


1-95317
msk
2002-07-17 13:57
2002.07.29
блокировка клавиатуры