Инициализация в объявлении

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Инициализация в объявлении

Сообщение Brainenjii »

Есть ли какая директива, чтобы делать подобное:

Код: Выделить всё

Type TMyObject = Class
  Private
    fMyField: Integer = 100;
...
End;
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

const?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Я хочу некоторым классам ассоциировать числовые значения вне конструктора

Код: Выделить всё

Type TMyObject = Class
  Const
    fMyField: Integer = 100;
...
End;

конечно тоже не прокатывает...
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

можно, но зачем? Паскаль - это вам не Жava.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

А чем не нравится

Код: Выделить всё

constructor TMyObject.Create;
begin
 fmyField := 100;
end;

Длинно? Согласен. Но читабельнее.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Захотел новое поведение для кода, а переписывать все конструкторы немножко лень ^_^ Да и вообще, решение с инициализацией в объявлении мне представляется изящней... Попробовал так:

Код: Выделить всё

    Property ClassID: Integer Read fClassID Default 101;

Не взлетело - bClassID все-равно 0...
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Модификатор default для свойств простых типов указывает вритеру, сохранять значение свойства или нет, но не как не инициализирует его.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Пичалька ^_^
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

вариант - включить статические поля классов.
инициализировать их значения в секции initialization юнита.
пример:

Код: Выделить всё

unit testapp;
{$mode objfpc}{$H+}
{$static on}

interface

uses
  Classes, SysUtils;
type
TMyClass = class
private
   fMyField: Integer; static;
end;
implementation

{$R *.lfm}
intialization
  TMyClass.fMyField:= 100;
end. 
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

включить статические поля классов.


Уже почти не надо :)
http://wiki.freepascal.org/User_Changes ... directives

Однако, статическое поле -- это совсем не то, что нормальное поле со значением по умолчанию.

Если поле published, можно инициализировать через RTTI:

Код: Выделить всё

p := GetPropInfo(Self, 'ClassID');
SetOrdProp(Self, p, p^.Default);

Ну а так либо в цикле, либо вызывать для руками для каждого свойства.
Особенно помогает, когда есть много наследников, которые отличаются только значениями по умолчанию --
см. пример в компоненте TAChart, модуль TATypes, класс TChartPen и его наследники.
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

Однако, статическое поле -- это совсем не то, что нормальное поле со значением по умолчанию.


ну так и не спорю, но вполне можно использовать статическое поле класса для задачи ТС.

ведь он просит:
Я хочу некоторым классам ассоциировать числовые значения вне конструктора


соответственно ему и нужно - поле класса, а Вы предлагаете поле published - которое будет принадлежать экземпляру класса.

единственное неудобство, что, как я понял, ТС нужно константное поле класса, а в случае со статическим полем, его можно переопределить. Т.е. нельзя сделать static и одновременно const.
Аватара пользователя
AlexVinS
новенький
Сообщения: 95
Зарегистрирован: 27.01.2009 00:18:01

Сообщение AlexVinS »

Есть способ сделать через модификатор default у свойств. Копать в сторону RTTI. Если коротко: в конструкторе проходим по всем свойствам и устанавливаем их в default.
(выше тоже самое написали :oops: )
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

В конструкторе можно и без RTTI нужные поля выставить... Вариант со статиком, как понимаю, хорош экономией памяти (правда слабо представляю - сколько нужно объектов, чтобы это принесло ощутимые плоды)... В любом случае - по объему кода и читабельности, вариант с

Код: Выделить всё

Type TMyObject = Class
  Private
    fMyField: Integer = 100;
...
End;
вне конкуренции, но не работает ^_^ Присвоение сделал обычно через Constructor...
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

const из третьего поста работает. А если нужны модифицируемые поля то лучше через конструктор.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

project1.lpr(15,3) Fatal: Syntax error, "identifier" expected but "CONST" found
Ответить