Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизДеструктор в конструкторе Найти похожие ветки
← →
Анонимщик (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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.031 c