Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-16062
_sulent
2004-01-12 14:08
2004.02.06
Помогите народ, пожалуйста


14-16693
din_tsk
2004-01-15 16:24
2004.02.06
---|Ветка была без названия|---


4-16804
DDA2
2003-11-28 18:28
2004.02.06
Handle для папки


3-16153
Boroda Oleg
2004-01-14 16:26
2004.02.06
Обновление БД Interbase через Query автоматически


6-16550
Haxx
2003-12-03 15:51
2004.02.06
Какая библиотека нужна для коннект с MySQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский