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

Вниз

Вопрос по конструкторам объектов   Найти похожие ветки 

 
Starkom   (2002-04-12 15:21) [0]

можно ли в конструкторе объекта, допустим наследованного от TControl сделать подобное:
inherited Control;
if что-то then
begin
Self:=nil;
exit;
end;

Если да, то что будет с памятью?


 
kull ©   (2002-04-12 15:33) [1]


> inherited Control;


не понял что-то... и потом в конструкторе уже Self<>nil.


 
Starkom   (2002-04-12 15:34) [2]

так как раз и надо, чтобы при каких-то условиях, Self после вызова конструктора был nil


 
kull ©   (2002-04-12 15:34) [3]

Зачем Self:=nil - это некрасиво и некоректно.
Вопрос один: зачем это надо?


 
Бурундук   (2002-04-12 15:39) [4]

В конструкторе ты Self не изменишь, да это и смысла не имеет.
Можно сделать что-нибудь вроде

inherited Create;
if что-то then
begin
Abort;
end;

function CreateMyObj: TMyObj;
begin
try
Result := TMyObj.Create;
except
on EAbort do Result := nil;
end;
end;


 
Starkom   (2002-04-12 15:43) [5]

есть конструктор
constructor CreateFromAnotherObject(AnotherObject)
есть цикл, в котором вызываются конструкторы
если AnotherObject не отвечает каким-либо условиям, конструктор должен как-то оповестить вызывающий метод, о том, что все плохо (просто цикл должен в таком случае немедленно завершиться).
Хотелось бы что-то такое, чтобы все работа с очищением памяти в таком случае находилоась прямо в конструкторе:
for i:=0 to n-1 do
begin
AnyArray[i]:=TMyObject.CreateFromAnotherObject(AnotherObject[i]);
if not Assigned(AnyArray[i]) then break;//
end;


 
kull ©   (2002-04-12 15:46) [6]

ах вот вы о чем, извращенцы...


 
Бурундук   (2002-04-12 15:49) [7]

Просто возбуди эксепшн в конструкторе
- и память автоматически очистится, и цикл прервётся.
а вне цикла ее обработай

try
for i:=0 to n-1 do
begin
AnyArray[i]:=TMyObject.CreateFromAnotherObject(AnotherObject[i]);
//if not Assigned(AnyArray[i]) then break;//
end;
except
on MyExcept do ...
end;


 
Starkom   (2002-04-12 15:52) [8]

2 Бурундук:
Точно память очистится? Можно где-нибудь про это поподробнее почитать?


 
Бурундук   (2002-04-12 15:56) [9]

Конструктор всегда вызывается в неявном try-блоке.
При возникновении любой исключительной ситуации в нём
(если, конечно, она внутри него не обработана)
память, выделенная под объект, освобождается.
Где об этом почитать можно - не помню.


 
Starkom   (2002-04-12 16:01) [10]

ок, попробую
спасибо.


 
Digitman ©   (2002-04-12 16:09) [11]

>Starkom
Память, быделенная под экземпляр, освободится - за это-то как раз волноваться не нужно. А вот об освобождении памяти, возможно явно тобой выделенной в контексте работы конструктора, ты должен заботиться сам. Обычно это делать удобней всего в контексте деструктора, поскольку в рез-те исключения в конструкторе перед освобождением памяти под экз-р будет вызван твой деструктор.



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
3-80739
Студент
2002-04-05 13:19
2002.04.25
Кластеры в : что это такое?


1-80881
snoup
2002-04-14 01:07
2002.04.25
Вот сегодня скачал RX Library, пожалуйста подскажите как, что,


1-80945
VJar
2002-04-11 23:35
2002.04.25
Создание вложеной папки


1-80892
OldGirstaris
2002-04-14 14:13
2002.04.25
Будут ли работать в Win2000 и в WinXP такие функции...


14-81042
vopros
2002-03-19 16:43
2002.04.25
Предлагаю злых нечеловеков исключать отсюда