Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.007 c
1-95340
Slawik
2002-07-15 10:33
2002.07.29
Отладка приложения


4-95626
Voland!
2002-05-21 03:31
2002.07.29
Крыса


1-95418
MAxiMum
2002-07-15 10:20
2002.07.29
Как узнать о том, что в RichEdit был вставлен текст???


1-95448
strel
2002-07-16 20:09
2002.07.29
Ошибка при использовании DLL !!! беда :)


14-95497
tovSuhov
2002-07-01 07:21
2002.07.29
Единый госэкзамен (ЕГЭ)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский