Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поля класса в Turbo Delphi


Автор: Felan 21.5.2008, 09:18
Есть класс:

Код

  T2 = class(T1)
  private
  class var
    fCV: UTF8String;
  var
    fCV: String;
  public
    constructor Create(); override;
  end;



Как и где правильно инициализировать поле fCV? Как сделать его константой? Че-то я не нашел в справке ничего похожего на class const?

Есть ли какие либо аналоги статических конструкторов или инициализаторов?

Автор: Alexeis 21.5.2008, 10:43
Цитата(Felan @  21.5.2008,  08:18 Найти цитируемый пост)

Как и где правильно инициализировать поле fCV? Как сделать его константой? Че-то я не нашел в справке ничего похожего на class const?

Код

type
  T2 = class(TOBject)
  const
    fCV: String = 'qqqq';
  public
    constructor Create();
  end;



Добавлено через 8 минут и 48 секунд
Цитата(Felan @  21.5.2008,  08:18 Найти цитируемый пост)
Есть ли какие либо аналоги статических конструкторов или инициализаторов? 

  Это можно спокойно сделать в конструкторе класса, дело в том что в Delphi конструктор предка не вызывается автоматически, его нужно вызвать вручную при помощи ключевого слова inherited. В С++ конструктор предка вызывается строго в определенном месте, потому там есть необходимость в такой инициализации. И еще в делфи нельзя создавать статические объекты, потому опять же нет необходимости в инициализации, так как любой динамический объект необходимо сначало создать, а затем уже инициализировать. 

Автор: Felan 21.5.2008, 11:47
Точно, че-то меня переклинило на class const.... То что надо. Далее чисто флейм smile

Цитата(Alexeis @  21.5.2008,  12:43 Найти цитируемый пост)
Это можно спокойно сделать в конструкторе класса, дело в том что в Delphi конструктор предка не вызывается автоматически, его нужно вызвать вручную при помощи ключевого слова inherited. В С++ конструктор предка вызывается строго в определенном месте, потому там есть необходимость в такой инициализации. И еще в делфи нельзя создавать статические объекты, потому опять же нет необходимости в инициализации, так как любой динамический объект необходимо сначало создать, а затем уже инициализировать.  

Ну во-первых это не статические поля, а поля класса. Точно разницу не помню, но это разные вещи. Во-вторых, причем здесь вызывается он автоматом или нет? Ну даже если и не вызывается, его все равно надо будет вызвать в каком-либо месте. И тогда будет произведена повторная инициализация.

Автор: Alexeis 21.5.2008, 12:07
Цитата(Felan @  21.5.2008,  10:47 Найти цитируемый пост)
Ну во-первых это не статические поля, а поля класса.

  Статические не в смысле static, а в смысле что создаются одновременно с объектом. В Delphi такого нет.  
Цитата(Felan @  21.5.2008,  10:47 Найти цитируемый пост)
Во-вторых, причем здесь вызывается он автоматом или нет?
 К тому что в Delphi нет необходимости во всяких статических конструкторах и инициализаторах, а в С++ для того чтобы проинициализировать переменную-поле до вызова конструктора предка приходиться пользоваться статическим конструктором.

Автор: Felan 21.5.2008, 13:06
Цитата(Alexeis @  21.5.2008,  14:07 Найти цитируемый пост)
Статические не в смысле static, а в смысле что создаются одновременно с объектом. В Delphi такого нет.  

Это поля объекта.
А я говорю о полях класса.

Тпа
Class var
Class procedure
Разве они создаются с КЛАССОМ. А следовательно, возможно их надо будет инициализировать, и использовать до того, как будет создан хотя бы один объект.

Автор: Alexeis 21.5.2008, 14:06
Цитата(Felan @  21.5.2008,  12:06 Найти цитируемый пост)
А следовательно, возможно их надо будет инициализировать, и использовать до того, как будет создан хотя бы один объект.

  Ааа эти, они инициализируются точно также как и в C++ в любом месте где это допустимо. 
<имя класса>.<имя переменной класса> := Some_value;

Автор: Felan 21.5.2008, 14:45
Так вот в том и вопрос, где их лучше, или положено, инициализировать. Если в конструкторе, то при каждом создании они будут переинициализироваться... так-то в принципе, не жалко... но вот для многопоточных приложений надо будет синхронизацию городить... В секции initialization - нарушается инкапсюляция... 

Перефразирую вопрос, есть ли специальные "секции"/места/методы для инициализации таких полей?

Автор: Alexeis 21.5.2008, 15:22
Цитата(Felan @  21.5.2008,  13:45 Найти цитируемый пост)
Так вот в том и вопрос, где их лучше, или положено, инициализировать.

Сам себе и отвечаешь
Цитата(Felan @  21.5.2008,  12:06 Найти цитируемый пост)
А следовательно, возможно их надо будет инициализировать, и использовать до того, как будет создан хотя бы один


  Разумеется логичным будет инициализировать их вне класса, в объекте, который будет их инстанцировать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)