Хочется странного... сделать автосоздание объектов-членов

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

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

Ответить
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Хочется странного... сделать автосоздание объектов-членов

Сообщение NTFS »

Хочется как-то реализовать возможность автоматического создания объектов в классе.

Например, есть класс

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

TMyClass1 = class
   List:TStringList ;
   C2:TMyClass2 ;
end ;


Нужно, чтобы после вызова:

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

  MC1 := TMyClass1.Create ;


объекты MC1.List и MC1.C2 уже содержали созданные экземпляры соответствующих классов.

Есть мысли, как это сделать правильно?

Дополнительно, было бы классно, чтобы они и удалялись после вызова MC1.Free
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

переобявить оператор присвоения.

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

Operator := (r : TMyClass1) z : TMyClass1;
begin
  z := r;
  if not assigned(z.list) then z.list := tstringlist.create;
  if not assigned(z.C2) then z.C2 := TMyClass2.create;
end;

Также можно сделать чтоб работало вообще для всех классов не являющихся персистентом, тогда нужно переобявлять оператор присвоения для TObject и проверять после присвоения не является ли он TPersistent, затем найти в нем все TPersistent и создать их тем классом которым они являются (количество пропертей узнать можно, а вот переменных не знаю).

С освобождением(если не добавлять в клас destroy) можно поступить разными методами:
1. При создании объектов записывать их в какой-то список и освобождать на finalization.
2. Создать процедуру освобождения

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

Free(MC1)
которая будет искать все чилды и освобождать(если переменные найти не получится - их можно будет сразу где-то записать).


как альтернатива - можно написать препроцессор который будет добавлять в классы конструктор и дестрой.
Последний раз редактировалось carrots 03.07.2011 04:10:31, всего редактировалось 2 раза.
Аватара пользователя
minoshi
постоялец
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Сообщение minoshi »

не то ?

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

unit alsmplayer;
...

type tmplayer = class
private 
  ftimer   : ttimer;   //таймер
  fterm    : tterminal;  //терминал
  ....
 public
  constructor create(const aowner: tobject = nil);
  ...
end;

implementation

constructor tmplayer.create(const aowner: tobject);
begin
 fterm := tterminal.create(nil);
 ftimer := ttimer.create(nil);
 end;
 ....
end.
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

я так понял он не хочет constructor и destructor вписывать
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Можно сделать через RTTI, правда тогда придется объявить для полей published свойства. В конструкторе базового класса перебирать все published свойства и для объектных - создавать экземпляр. Ну и в деструкторе так-же.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

У RTTI есть ограничения - например массив автосоздающихся объектов таким образом не получится сделать.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

carrots писал(а):я так понял он не хочет constructor и destructor вписывать


Мне тоже так показалось.
Интересно, что плохого в перекрытии Create и Destroy с созданием/освобождением классов-полей?
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

svk12 писал(а):
carrots писал(а):я так понял он не хочет constructor и destructor вписывать


Мне тоже так показалось.
Интересно, что плохого в перекрытии Create и Destroy с созданием/освобождением классов-полей?

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

Сообщение Brainenjii »

Парсер и генератор кода надо, ИМХО...
Ответить