Конференция "FreePascal" » Глупый вопрос про конструкторы! [Win32]
 
  • 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)

  • KA_ © (14.01.05 15:09) [5]
    > trofimich   (12.10.04 16:51) [2]

    Конструктор TObject вызывать не надо :)
    Он ведь не виртуальный. А все необходимые действия и так включаются в этот метод Create, потому что он и есть конструктор.
 
Конференция "FreePascal" » Глупый вопрос про конструкторы! [Win32]
Есть новые Нет новых   [119261   +45][b:0][p:0.001]