-
Stargazer (12.10.04 07:47) [0]Привет всем!
Люди, я чего-то в этой жизни не понимаю.
Описываю класс с конструктором.
Потом завожу переменную этого же класса.
Далее - прикол.
Конструктор НЕ вызываю.
Проверяю переменную - она пустая, NIL. То есть ссылка на объект отсутствует.
А методы объекта нормально вызываются.
Что за фокусы?
Всю жизнь делал a := Ta.Create().
Вот код.
TYPE
CDummy = class
constructor Create;
procedure Hello;
end;
procedure CDummy.Hello;
begin
ShowMessage('Hello!');
end;
constructor CDummy.Create;
begin
end;
VAR
Dummy : CDummy;
BEGIN
Dummy.Hello; // а переменная = NIL!!! И не падает!
END. -
cyborg © (12.10.04 09:11) [1]Версия какая? У 1.9.4 такая бурда.
-
trofimich (12.10.04 16:51) [2]Не знаю как во FreePascal, а в дельфях тут две ошибки:
1) То, что ты не вызвал конструктор TObject в своём конструкторе
2) У тебя не создан экземпляр класса. Переменные типа class - это всегда ссылки, порэтому не могут быть созданы статически.
Решения:
1) Замениить class на object
2) Сделать class procedure Hello; и CDummy.Hello -
Stargazer (12.10.04 20:30) [3]2 cyborg
FPC 1.0.6
2 trofimich
В том-то и дело, что без вызова конструктора методы класса работают. Хотя переменная типа class равна NIL. -
Cobalt © (12.10.04 23:33) [4]2 Stargazer
А всё очень просто - сам-то экземпляр класса не использовался - вот и нету ошибки.
А попробукй завести в классе поле, хоть integer. И вывести его в ShowMessage - сразу AV словишь.
Это особенность реализации классовых объектов - вызывается метод, и ему в качестве неявного параметра передаётся адрес экземпляра. А там уж как получится.
В C++ - также, в любом компиляторе. Есть даже в MS-ом коде (с форума RSDN инфа) - есть проверки типаif '(this==null) -
> trofimich (12.10.04 16:51) [2]
Конструктор TObject вызывать не надо :)
Он ведь не виртуальный. А все необходимые действия и так включаются в этот метод Create, потому что он и есть конструктор.