Форум: "Потрепаться";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
ВнизНеужели нельзя описать 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c