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

Вниз

Деструктор в конструкторе   Найти похожие ветки 

 
Анонимщик ©   (2004-01-22 16:37) [0]

Предположим, я хочу создать объект:
var
mO: TMyObject;
begin
mO := TMyObject.Create;
...
end;

Так вот, можно ли как-то написать конструктор так, чтобы, если этот конструктор решит, что не нужно создаваться, то чтобы mO ставал бы равным nil.
Тогда можно было бы сделать так:
var
mO: TMyObject;
begin
mO := TMyObject.Create;
if mO = nil then exit;
// действия, если объект создан успешно
...
end;

Не хотелось бы использовать исключения.


 
TUser ©   (2004-01-22 16:39) [1]

Точно не уверен, конечно, но можно попробовать в конструкторе не зывавать inherited Create.


 
Тимохов ©   (2004-01-22 16:41) [2]

Анонимщик © (22.01.04 16:37)

> Не хотелось бы использовать исключения.

А зря

TUser © (22.01.04 16:39) [1]
Ничего не измениться


 
Digitman ©   (2004-01-22 16:47) [3]


> Не хотелось бы использовать исключения


а без этого - никак

спрашивается, какого хрена где-то в коде вызван конструктор некоего объекта, завершившийся успешно (нет ошибок), и результатом чего стала возвращенная конструктором отсутствующая (абсурд !) ссылка на область памяти, занимаемой якобы успешно сконструированным объектом ?


 
Анонимщик ©   (2004-01-22 16:55) [4]

Digitman ©
Объект не должен создаваться.
Вот если бы можно было вызвать в конструкторе деструктор, тогда и вопроса бы не было.


 
MBo ©   (2004-01-22 16:59) [5]

>Анонимщик
F1 топик Constructors

If an exception is raised during execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object.


 
Тимохов ©   (2004-01-22 17:02) [6]

Добавить к 5 хочется следующее:
если raise был посреди конструктора, то в деструкторе надо учитывать, что не все данные могли до конца инициализироваться.

например

constructor create;
begin
list1 := tlist.create;
raise exception.create;
list2 := tlist.create;
....
end;

destructor destroy;
begin
for i = 0 to list1.count-1 do ...
for i = 0 to list2.count-1 do ...
end;

Так деструкторы писать нельзя.

надо так

destructor destroy;
begin
if list1 <> nil then for i = 0 to list1.count-1 do ...
if list2 <> nil then for i = 0 to list2.count-1 do ...
end;


 
Anatoly Podgoretsky ©   (2004-01-22 17:06) [7]

Это лишнее raise exception.create;


 
Тимохов ©   (2004-01-22 17:14) [8]

Anatoly Podgoretsky © (22.01.04 17:06) [7]
Это пример.
Что здесь лишнего?


 
Digitman ©   (2004-01-22 17:15) [9]


> Анонимщик © (22.01.04 16:55) [4]



> Объект не должен создаваться.


он будет автоматически разрушен (т.е память размером в InstanceSize, автоматически выделенная под экз-р объекта ДО исключения, будет безусловно освобождена без твоего явного вмешательства), если в ходе работы иерархии конструирующих методов (конструктор вполне м.б. виртуальным) в каком-то из них неожиданно возникло (либо было осознанно тобой возбуждено) программное искключение


 
Skier ©   (2004-01-22 18:01) [10]

var
mO: TMyObject;
begin
//.....
mO := nil;
//.....
end;

Самое то ! :)


 
Анонимщик ©   (2004-01-22 18:46) [11]

Digitman
Я согласен даже на извращения, но без исключений.

Skier
nil должен быть только в том случае, если конструктору что-то не понравится


 
kull ©   (2004-01-22 18:51) [12]


> Анонимщик

А чем исключения не угодили?


 
Анонимщик ©   (2004-01-22 18:59) [13]

kull
Это такое условие моей задачи


 
Тимохов ©   (2004-01-22 19:00) [14]

Анонимщик © (22.01.04 18:46) [11]
Не занимайтесь ерундой :)))
Все-таки интересна природа вашей нелюбви к исключениям.
Присоединяюсь к 12. Так почему?


 
Тимохов ©   (2004-01-22 19:01) [15]


> Это такое условие моей задачи

Да, тут не поспоришь.
Кто задачу то ставил?


 
Vuk ©   (2004-01-22 19:10) [16]

>Это такое условие моей задачи
А RTL тоже переписывать будете?


 
Юрий Зотов ©   (2004-01-22 19:15) [17]

> Анонимщик © (22.01.04 16:37)
> можно ли как-то написать конструктор так, чтобы, если этот
> конструктор решит, что не нужно создаваться, то чтобы mO
> ставал бы равным nil.

Можно, и даже без тспользования исключений. Только не конструктор, а NewInstance. А в конструкторе не создавать объект уже поздно - он УЖЕ создан при ВХОДЕ в конструктор, а потому в самом конструкторе его можно только уничтожить . И легальное средство для этого - возбуждение исключения.

Поэтому лучше сделайте так, как рекомендует Borland - возбудите исключение в конструкторе. А вызывайте его, например, так:

try
mo := TMyObject.Create;
except
mo := nil
end;

Тогда получите то, что хотите, а исключение погасится.


 
Тимохов ©   (2004-01-22 19:28) [18]

Юрий Зотов © (22.01.04 19:15) [17]
Извините за Off: Сила педагогического таланта! Вы книги не пишете?


 
Анонимщик ©   (2004-01-23 18:08) [19]

Юрий Зотов

Ну это намного ближе к тому, что я хотел услышать. Спасибо и на этом.


 
Анонимщик ©   (2004-01-23 18:09) [20]

Тимохов

Любовь - это, как известно, неодолимая потребность. Я к исключениям такой тяги не имею.


 
Vuk ©   (2004-01-23 18:15) [21]

to Анонимщик:
>Любовь - это, как известно, неодолимая потребность. Я к
>исключениям такой тяги не имею.
И опять повторю вопрос. А RTL Вы теперь тоже перепишите?


 
Плохиш_   (2004-01-23 18:25) [22]


> Анонимщик © (23.01.04 18:09) [20]
> Тимохов
>
> Любовь - это, как известно, неодолимая потребность. Я к
> исключениям такой тяги не имею.

Что ж, Вам придётся менять среду разработки


 
Анонимщик ©   (2004-01-23 19:20) [23]

Vuk © (23.01.04 18:15) [21]
> И опять повторю вопрос. А RTL Вы теперь тоже перепишите?

А что, интересно?


 
Тимохов ©   (2004-01-23 19:23) [24]


> Анонимщик © (23.01.04 19:20) [23]
> Vuk © (23.01.04 18:15) [21]
> > И опять повторю вопрос. А RTL Вы теперь тоже перепишите?
>
> А что, интересно?

Странный (по крайнем мере) Ваш вопрос-ответ.
Vuk Вас пытается натолкнуть на мысль, что Вам придется многое сделать самому, чтобы реализовать, то, что нужно...


 
vuk ©   (2004-01-23 19:24) [25]

>А что, интересно?
Угу. Интересно как Вы от исключений в RTL будете избавляться.


 
Анонимщик ©   (2004-01-26 10:34) [26]

Ну и чего вы пристали? Это был почти праздный интерес.


 
Anatoly Podgoretsky ©   (2004-01-26 10:49) [27]

Так, тебе можно, а другим нельзя?


 
Анонимщик ©   (2004-01-26 11:38) [28]

Да можно, почему это? Пожалуйста. Но должен признать, что мне не нравится не собственно VCL, а компилятор дельфийский.


 
Zelius ©   (2004-01-26 11:47) [29]

Как вариант, создать ф-ию, либо обычную, либо метод класса, которая бы проверяла, может ли объект быть создан и тогда возвращала бы либо объект, либо nil, и ее вызывать вместо конструктора.


 
Анонимщик ©   (2004-01-26 11:51) [30]

Zelius

Да, можно.
Всем спасибо.



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

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

Наверх




Память: 0.54 MB
Время: 0.024 c
3-16138
Вованчик
2004-01-15 11:03
2004.02.06
и снова SELECT


4-16822
kin_soft
2003-11-24 07:32
2004.02.06
WinApi wNetShareAdd где она в Дельфи?


1-16298
Grinder
2004-01-24 13:43
2004.02.06
Форма как hint


14-16744
Dark Simpson
2004-01-15 19:58
2004.02.06
Геморрой с Офисом 97


1-16353
Iron Maiden
2004-01-24 15:03
2004.02.06
Установить Memo в самый конец