Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
_Промешан_ Member Откуда: Сообщений: 937 |
Я плохо выспался и у меня рябит в глазах или вот такое:procedure TForm1.Button1Click(Sender: TObject); var a: TA; begin a.Something; end; это нормально? В смысле того, что не вызывает ошибку?
|
|
26 ноя 18, 22:05 [21745464] Ответить | Цитировать Сообщить модератору |
MBo Member Откуда: Сообщений: 64 |
_Промешан_, вызываемый метод не задействует никаких данных экземпляра класса, поэтому не обращается к неинициализированной памяти, что могло бы вызывать ошибку (ср. классовые методы) |
26 ноя 18, 22:09 [21745470] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 3257 |
Это нормально. 1. Компилятор не отслеживает инициализацию 2. В вызываемом методе нет обращения к внутренним полям объекта, потому фиолетово какой Self у него будет Будет метод виртуальным, или работающим с полями - будет и ошибка. |
||
26 ноя 18, 22:14 [21745475] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
TA = class(TObject)
Заменяем на
TA = object
И радуемся. |
26 ноя 18, 22:17 [21745476] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
Хотя метод объявлен в секции private и вообще не должен быть доступен для вызова вне класса. Но это так, детали |
26 ноя 18, 22:20 [21745480] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 3257 |
Учи матчасть, студент... |
||
26 ноя 18, 22:22 [21745484] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 937 |
Это особенность Дельфей. |
||
26 ноя 18, 22:28 [21745488] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 937 |
Ну и как бы нормально, что A <> NIL = TRUE? |
||
26 ноя 18, 22:29 [21745489] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 3257 |
Нормально. Локальные переменные неуправляемых типов не инициализируются. |
||
26 ноя 18, 22:42 [21745501] Ответить | Цитировать Сообщить модератору |
MBo Member Откуда: Сообщений: 64 |
Да, это же локальная переменная, они не инициализируются автоматически (за исключением строк и т.п.) |
||
26 ноя 18, 22:47 [21745508] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 1268 |
strict private, если не хочешь дружественную видимость, или как она там называется. |
||
26 ноя 18, 23:06 [21745537] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
А вот интересная вещь творится, потому как VCL пистрит именно private секциями которыми в будущем нельзя воспользоваться. К примеру TLanguages,...,TMonitor
Application.CreateForm(TForm1, Form1); ShowMessage(Form1.Monitor.GetTop); Нельзя получить доступ к этим функциям, даже если создать TMonitor отдельно ... Может тогда существует отдельная опция ? Включающая строгий режим в unit-е ? |
|
27 ноя 18, 00:01 [21745576] Ответить | Цитировать Сообщить модератору |
goldmi45 Member Откуда: Сообщений: 1086 |
Гирлионайльдо, класс Б может получить доступ к приватной секции класса А, если он находится в тоже модуле, что и класс А. Даже если они не связаны наследованием. |
27 ноя 18, 09:51 [21745717] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 1268 |
Гирлионайльдо, Понятие класса, дружественного другому классу. |
27 ноя 18, 10:05 [21745743] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 396 |
Кому нельзя? Соседям по юниту - можно, что и применяют местами. А стороннему коду да, нельзя. На то он и private |
||
27 ноя 18, 10:45 [21745788] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 937 |
Каких типов? Можно пример управляемого? |
||||
28 ноя 18, 22:57 [21747934] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
_Промешан_,
важно понимать, что исключение падает только при попытке доступа к данным класса, то есть к сэлфу. здесь доступа к сэлфу нет, соответственно всё работает нормально. непосредственно вызов метода у класса не приводит к проблемам, пока нет попытки доступа к сэлфу. более того - внутри метода можно проверить - создан ли сэлф или нет и если нет - то можно просто выйти или что-то вернуть в result. я видел реализации такого в коде. |
||
28 ноя 18, 23:37 [21747947] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46926 |
String. Posted via ActualForum NNTP Server 1.5 |
||
29 ноя 18, 01:24 [21747986] Ответить | Цитировать Сообщить модератору |
Фэйтл Эра Member Откуда: Сообщений: 553 |
Расскажи, пожалуйста - как это проверить? |
||
29 ноя 18, 01:51 [21747990] Ответить | Цитировать Сообщить модератору |
DimaBr Member Откуда: Сообщений: 10877 |
Зачем обращаться GetTop, если нужно делать так
Application.CreateForm(TForm1, Form1);
ShowMessage(Form1.Monitor.Top);
|
|||
29 ноя 18, 08:04 [21748019] Ответить | Цитировать Сообщить модератору |
Beltar Member Откуда: Сообщений: 175 |
А разве ссылка на Self не передается как неявный параметр всегда? |
||
29 ноя 18, 09:35 [21748069] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 396 |
Передается, но не проверяется на валидность же |
||
29 ноя 18, 10:43 [21748163] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
Beltar, передаётся. если сэлфа нет, передастся как раз nil. |
29 ноя 18, 11:58 [21748341] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
DimaBr, Тут смысл никак нужно, а то что это невозможно, по возможности возможно с той же дверью. |
29 ноя 18, 11:59 [21748345] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
Как ни странно: if self = nil then ... :) |
||||
29 ноя 18, 12:00 [21748346] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 3257 |
Управляемые: строки, дин.массивы, интерфейсы, варианты (с ARC ещё и объекты). |
||
29 ноя 18, 12:49 [21748432] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 1268 |
Да неужели? ... type TMyClass = class procedure Test; end; procedure TMyClass.Test; begin WriteLn(Integer(Self)); end; var mc: TMyClass; begin mc := TMyClass.Create; mc.Free; mc.Test; // <-- что тут будет напечатано? ... |
||||
29 ноя 18, 12:50 [21748434] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
FreeAndNil в помощь. Ну а любителям хранения зомби-ссылок никто уже не поможет. Ни тут ни вообще :) |
29 ноя 18, 14:13 [21748585] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 10719 |
var mc: TMyClass; begin mc.Test; // <-- что тут будет напечатано? |
||
29 ноя 18, 15:30 [21748743] Ответить | Цитировать Сообщить модератору |
Квейд Member Откуда: Kyiv, Ukraine Сообщений: 5154 |
procedure TObject.Free; begin // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear {$IFNDEF AUTOREFCOUNT} if Self <> nil then Destroy; {$ENDIF} end; |
||||
29 ноя 18, 16:10 [21748817] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
_Vasilisk_, спасёт. если инициализировать нилом. Квейд, собственно, да... |
29 ноя 18, 17:10 [21748896] Ответить | Цитировать Сообщить модератору |
Фэйтл Эра Member Откуда: Сообщений: 553 |
Каким образом неинициализированному объекту можно установить значение свойства (Self)? |
||
29 ноя 18, 21:42 [21749137] Ответить | Цитировать Сообщить модератору |
Фэйтл Эра Member Откуда: Сообщений: 553 |
Дело в том, что это "волшебное" свойство, оно является значением содержимого переменной классового типа, а не свойством экземпляра объекта. То есть, неинициализированный указатель не будет nil. И, чтобы понять, что класс не был создан, переменную класса следует сперва инициализировать нилом... как-то не очень умно? :) Но этот фокус с self никак не поможет в случае использования алиасов (когда две переменные по дизайну указывают на один объект) type X = class метод; end; var a, b : C; ... begin a := C.Create(); ... b := a; // Алиас ... FreeAndNil(a); ... b.метод; // Ничего не знает, что self теперь nil |
||||
29 ноя 18, 22:26 [21749178] Ответить | Цитировать Сообщить модератору |
Гирлионайльдо Member Откуда: Сообщений: 427 |
Фэйтл Эра, А ты не бери прямой адрес. |
30 ноя 18, 00:47 [21749266] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
mc := nil; рекомендую взять отладчик и посмотреть, там всё отлично видно. |
||||
30 ноя 18, 01:02 [21749270] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3029 |
mc, если что, это и есть ссылка на Self. Не на класс, а на экземпляр класса. |
30 ноя 18, 01:03 [21749273] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / Delphi | ![]() |