Перекрёстные ссылки на object

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

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

Перекрёстные ссылки на object

Сообщение XProger » 30.09.2009 09:32:19

Имеется желание сделать вот так:
Код: Выделить всё
TXML = object
  Node : TXML;
end;
Очень хотелось бы реализовать это без классов и побочных PXML, которые в objfpc режиме требуют обязательного указания ^ :)
Delphi позволяет творить подобное с record структурами.
Решаема ли задача при таких условиях? )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение Дож » 01.10.2009 19:26:43

А если написать так:
Код: Выделить всё
TXML = object
  Node1 : TXML;
  Node2 : TXML;
end;

То что должно получится в памяти (в перспективе)?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 19:46:24

Оно не скомпилируется. FPC и Delphi этого не допускает. Но в Delphi есть record с методами, с которым это прокатит, хочется аналог в FPC найти.
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение carrots » 01.10.2009 20:23:27

XProger писал(а):Имеется желание сделать вот так:
Код: Выделить всё
TXML = object
  Node : TXML;
end;
Очень хотелось бы реализовать это без классов и побочных PXML, которые в objfpc режиме требуют обязательного указания ^ :)
Delphi позволяет творить подобное с record структурами.
Решаема ли задача при таких условиях? )

Такого типа объект не может быть создан, так как каждый дочерный TXML будет создавать в себе еще себя и так до тех пор пока вся память не кончится.
Так что создавать подобные объекты или рекорды не логично и приведет к зависанию задачи.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 20:44:52

Звиняйте что ввёл в заблуждение, но я наткнулся на неприятную особенность:
Код: Выделить всё
TXML = object
private // или public, не важно
  XML : array of TXML;
end;
Если убрать private, то всё успешно компилируется, в противном случае - "Type 'TXML' is not yet completely defined". Это только в Delphi, в FPC по прежнему компилироваться не хотит :\
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение debi12345 » 01.10.2009 21:10:00

Смотря для чего все это нужно.
Попробуйте трюки с интерфейсами (помню, мне помогло обойти ограничения на циркулярное включение модулей в секциях INTERFACE )

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

//----------------
TXMLif = interface
..
end;
//----------------
TXML1 = class(TXMLif)
..
end;
//---------------
TXML2 = class(TXMLif)
private
XML : array of TXML1;
..
end;
//------------------


Со стороны "клиентов" этих классов, TXML1 и TXML2 совместимы по присвоениям и приведениям типа.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 21:14:08

Как раз, хочется именно чистых объектов без рюшек классовых )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение debi12345 » 01.10.2009 21:59:49

Как раз, хочется именно чистых объектов без рюшек классовых )


А что, планируется сверхминиатюрное приложение ? XML-парсинг вроде бы никогда не был легковесным.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Перекрёстные ссылки на object

Сообщение Sergei I. Gorelkin » 01.10.2009 22:02:13

Нету в FPC записей с методами, не ищите...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 22:16:32

debi12345, ну тут даже не в миниатюрности дело, просто всюду используются чистые объекты и TXML выбивался бы из общего стиля )
Но XML парсер весьма легковесный получился, и не хотелось бы вместо XML['mode']['mesh'].Content городить нечто вроде XML['model']^['mesh']^.Content )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение carrots » 01.10.2009 22:50:20

XProger писал(а):debi12345 не хотелось бы вместо XML['mode']['mesh'].Content городить нечто вроде XML['model']^['mesh']^.Content )

В таком случае почему бы не создать все-таки класс TXML c default пропертью которая будет возвращать TXML.
Код: Выделить всё
property Nodes[const Name: string]: TXML read GetNode write SetNode;  default;     

По моему тебе такой метод даже больше подходит.
Можно будет писать так XML['mode']['mesh'].Content...
Правда все объекты нужно будет создать и освободить, но я не вижу в этом никаких проблем.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 23:00:50

carrots, говорю же, не нужны мне классы, оно сейчас на них и реализовано )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва

Re: Перекрёстные ссылки на object

Сообщение carrots » 01.10.2009 23:03:03

Почему не нужны?
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Перекрёстные ссылки на object

Сообщение XProger » 01.10.2009 23:08:13

carrots, не вписываются в общую эстетику кода )
Аватара пользователя
XProger
новенький
 
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 4

Рейтинг@Mail.ru