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

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

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

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

Сообщение Brainenjii » 25.07.2011 14:58:59

Есть ли какая директива, чтобы делать подобное:
Код: Выделить всё
Type TMyObject = Class
  Private
    fMyField: Integer = 100;
...
End;
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение Padre_Mortius » 25.07.2011 15:01:25

const?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Brainenjii » 25.07.2011 15:13:34

Я хочу некоторым классам ассоциировать числовые значения вне конструктора
Код: Выделить всё
Type TMyObject = Class
  Const
    fMyField: Integer = 100;
...
End;

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

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

Сообщение hinst » 25.07.2011 15:23:14

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

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

Сообщение vada » 25.07.2011 15:38:38

А чем не нравится
Код: Выделить всё
constructor TMyObject.Create;
begin
fmyField := 100;
end;

Длинно? Согласен. Но читабельнее.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение Brainenjii » 25.07.2011 17:02:46

Захотел новое поведение для кода, а переписывать все конструкторы немножко лень ^_^ Да и вообще, решение с инициализацией в объявлении мне представляется изящней... Попробовал так:
Код: Выделить всё
    Property ClassID: Integer Read fClassID Default 101;

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

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

Сообщение Mr.Smart » 25.07.2011 17:15:37

Модификатор default для свойств простых типов указывает вритеру, сохранять значение свойства или нет, но не как не инициализирует его.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Brainenjii » 25.07.2011 17:19:48

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

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

Сообщение Kitayets » 04.08.2011 14:19:33

вариант - включить статические поля классов.
инициализировать их значения в секции 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. 
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

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

Сообщение Ask » 04.08.2011 14:46:12

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


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

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

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

Код: Выделить всё
p := GetPropInfo(Self, 'ClassID');
SetOrdProp(Self, p, p^.Default);

Ну а так либо в цикле, либо вызывать для руками для каждого свойства.
Особенно помогает, когда есть много наследников, которые отличаются только значениями по умолчанию --
см. пример в компоненте TAChart, модуль TATypes, класс TChartPen и его наследники.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

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

Сообщение Kitayets » 04.08.2011 14:58:35

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


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

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


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

единственное неудобство, что, как я понял, ТС нужно константное поле класса, а в случае со статическим полем, его можно переопределить. Т.е. нельзя сделать static и одновременно const.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

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

Сообщение AlexVinS » 04.08.2011 15:07:55

Есть способ сделать через модификатор default у свойств. Копать в сторону RTTI. Если коротко: в конструкторе проходим по всем свойствам и устанавливаем их в default.
(выше тоже самое написали :oops: )
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

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

Сообщение Brainenjii » 04.08.2011 15:18:55

В конструкторе можно и без RTTI нужные поля выставить... Вариант со статиком, как понимаю, хорош экономией памяти (правда слабо представляю - сколько нужно объектов, чтобы это принесло ощутимые плоды)... В любом случае - по объему кода и читабельности, вариант с
Код: Выделить всё
Type TMyObject = Class
  Private
    fMyField: Integer = 100;
...
End;
вне конкуренции, но не работает ^_^ Присвоение сделал обычно через Constructor...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение kipar » 04.08.2011 16:15:08

const из третьего поста работает. А если нужны модифицируемые поля то лучше через конструктор.
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

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

Сообщение Brainenjii » 04.08.2011 16:34:33

project1.lpr(15,3) Fatal: Syntax error, "identifier" expected but "CONST" found
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru