![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Стиль: саморазрушение
Igorek © (2002-10-30 20:22:00)Сегодня был такой случай: уничтожается обьект, метод которого в стеке вызовов процедур. Естественно, если после уничтожения мы в этом методе обратились бы к каким-либо полям данного (уже уничтоженного) обьекта - получили бы AccessViolation. К счастью мы этого не сделали и все нормально работает. Но не является ли такой подход признаком плохого стиля?
Бурундук (2002-11-05 11:47:00) [1]2Sectey © (05.11.02 11:16)
Зачем такие сложности?
Можно и так:
const
i: integer = 10;
begin
i := 40;
// типизированная константа - она совсем никакая
// не константа (без {$WRITEABLECONST OFF}или{$J-}),
// а самая что ни на есть переменная.
end;
Sectey (2002-11-05 11:16:00) [2]Совершенно согласин с evgeg.
вот пример
Const-> здель компилятор ругается благим матом 37. riable required
i = 10;
Var
p : ^integer;
begin
p := @i;
p^ := 40;
end;
а тут все ок
Const
i : integer = 10;
Var
p : ^integer;
begin
p := @i;
p^ := 40;
end;
в результате i = 40
Такойже фокус проходит и с
TTr = class
private
FCount : integer;
...
public
property Count: integer read FCount;
...
end;
Var
tr : TTr;
p : ^integer;
begin
p := @tr.Count;
p^ := 40;
end;
в результате tr.Count = 40
Igorek (2002-11-05 11:00:00) [3]
> Получается, что типизированные константы являются статическими
> переменными. Нетипизированные константы являются настоящими
> константами.
Спасибо за разъяснение. Ошибаться может каждый - я был неправ. К счастью Паскаль не мой родной язык.
evgeg (2002-11-04 19:05:00) [4]> Не нравиться мне Ваш преподавательский тон.
А мне не нравится, что вы утверждаете ерунду, не разобравшись в вопросе.
> Но тогда получаются константы не настоящие, если их можно "взломать" фишкой компилятора.
Получается, что типизированные константы являются статическими переменными. Нетипизированные константы являются настоящими константами.
Igorek (2002-11-04 17:03:00) [5]
> down (04.11.02 16:30)
> в опциях проекта поставить галочку напротив "Assignable
> typed constants"
Спасибо. Но тогда получаются константы не настоящие, если их можно "взломать" фишкой компилятора.
Bis (2002-11-04 16:49:00) [6]может я упустил смысл темы, но есть замечательный метод
FreeAndNil
и вызывать можно вроде где угодно и не ругаться на Паскаль
down (2002-11-04 16:30:00) [7]в опциях проекта поставить галочку напротив "Assignable typed constants"
Igorek (2002-11-04 16:28:00) [8]
procedure f;
const
I: Integer = 0;
begin
Inc(I);
end;
Как сделать, что-бы компилировалось и выполнялось?
Бурундук (2002-11-04 13:43:00) [9]AlexKniga прав - есть такая недокументированная
фича паскаля:
локальные типизированные константы сохраняют значение между
вызовами.
>Не допускается переприсваевание. :-(
Тут Вам не здесь. :)))
В паскале разрешается присваивание
типизированным константам.
(Есть, правда, опция компилятора, запрещающая это,
но по умолчанию она выключена)
Igorek (2002-11-04 12:42:00) [10]
> evgeg © (01.11.02 18:52)
> Это называется локальной переменной. Учите терминологию!
Не нравиться мне Ваш преподавательский тон. Ну да ладно.
Локальная статическая переменная - видимая в пределах метода, выделяется память и инициализируется при загрузке программы, сохраняет свое значение между вызовами метода, допускает переприсваивание.
2 AlexKniga
Не допускается переприсваевание. :-(
Мышь (2002-11-01 20:03:00) [11]Есть такой метод - Notification, вызываемый разрушающимся объектом, для того, чтобы уведомить другой объект, содержащий ссылку на разрушающийся. Вот в нем, как раз, и удобно обNILлить ссылку.
evgeg (2002-11-01 18:52:00) [12]> Статические переменные я имел ввиду видимые в пределах метода
Это называется локальной переменной. Учите терминологию!
AlexKniga (2002-11-01 18:45:00) [13]2 Igorek
Procedure MyProc;
Const МояСтатическаяПеременная: TМояСтатическаяПеременная;
Begin
End;
Igorek (2002-11-01 17:06:00) [14]
> evgeg © (31.10.02 22:53)
> > Igorek © (31.10.02 10:55)
>
> Сейчас закидаем.
...
Не буду спорить, но неубедительно.;-)
Статические переменные я имел ввиду видимые в пределах метода.
Область видимости в Паскале одна в пределах модуля.
Простите, если задел за живое.
evgeg (2002-10-31 22:55:00) [15]> само обращение к его методу выдаст Access V...(никак не запомню как пишется :)
Только обращение к вирт. методу или к полю. Вызов стат. метода не приведет к Access Violation.
evgeg (2002-10-31 22:53:00) [16]> Igorek © (31.10.02 10:55)
Сейчас закидаем.
Пример статической переменной:
var s: double;
Область видимости: в модулях interface и implemetation, в классах published, public, protected, private.
Учите матчасть и не говорите полной ерунды.
Насчет вызова деструктора из метода объекта. В VCL это используется в методе Free. В нем сначала проверяется, равен ли Self nil и если нет, вызывается деструктор.
Для корректной работы Free и нужно выставление объекта в nil.
Используется это в конструкторах и деструкторах.
type
TMyObj = class
FSomeObject: TSomeObject;
end;
constructor TMyObj.CReate;
begin
...
FSomeObject := TSomeObject.Create;
...
end;
destructor TMyObj.Destroy;
begin
...
FSomeObject.Free;
end;
Если в конструкторе произойдет исключение, вызовется деструктор Destroy, в котором будут освобождены только проинициализированные поля-объекты, т. к. при выделении памяти (перед вызовом конструктора) поля объекта обнуляются.
Tano (2002-10-31 22:35:00) [17]
> Zemal © (31.10.02 13:35)
IMHO, Вы в последнем сообщении погорячились - после выполнения деструктора объекта не станет и само обращение к его методу выдаст Access V...(никак не запомню как пишется :). То есть "OK" проверять негде будет.
Zemal (2002-10-31 13:35:00) [18]>>KSergey
Аха, с тобой согласен, нужно писать менеджер объектов, в котором отображать состояние объектов и действия с ними... вот только это "мартышкин труд", да и нафига такое делать? Легче в деструкторе объекта к примеру прописать такое: "OK := False;", а в методе: "if not OK then Abort;". И все проблемы :).
Anatoly Podgoretsky (2002-10-31 12:41:00) [19]Толик © (31.10.02 10:40)
Создать можно, но переменные для этой формы и дата модуля могут иметь право на существование, остальные лишнее, нормально и спокойно жить без них.
Юрий Зотов (2002-10-31 12:40:00) [20]> Song © (31.10.02 11:32)
Какая разница? GetMessage устроит?
Мы о словах говорим, или о принципах?