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

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

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

Ответить
Аватара пользователя
XProger
новенький
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва
Контактная информация:

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

Сообщение XProger »

Имеется желание сделать вот так:

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

TXML = object
  Node : TXML;
end;
Очень хотелось бы реализовать это без классов и побочных PXML, которые в objfpc режиме требуют обязательного указания ^ :)
Delphi позволяет творить подобное с record структурами.
Решаема ли задача при таких условиях? )
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

А если написать так:

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

TXML = object
  Node1 : TXML;
  Node2 : TXML;
end;

То что должно получится в памяти (в перспективе)?
Аватара пользователя
XProger
новенький
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва
Контактная информация:

Сообщение XProger »

Оно не скомпилируется. FPC и Delphi этого не допускает. Но в Delphi есть record с методами, с которым это прокатит, хочется аналог в FPC найти.
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

XProger писал(а):Имеется желание сделать вот так:

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

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

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

Сообщение XProger »

Звиняйте что ввёл в заблуждение, но я наткнулся на неприятную особенность:

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

TXML = object
private // или public, не важно
  XML : array of TXML;
end;
Если убрать private, то всё успешно компилируется, в противном случае - "Type 'TXML' is not yet completely defined". Это только в Delphi, в FPC по прежнему компилироваться не хотит :\
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

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

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

type

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


Со стороны "клиентов" этих классов, TXML1 и TXML2 совместимы по присвоениям и приведениям типа.
Аватара пользователя
XProger
новенький
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва
Контактная информация:

Сообщение XProger »

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

Сообщение debi12345 »

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


А что, планируется сверхминиатюрное приложение ? XML-парсинг вроде бы никогда не был легковесным.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Сообщение XProger »

debi12345, ну тут даже не в миниатюрности дело, просто всюду используются чистые объекты и TXML выбивался бы из общего стиля )
Но XML парсер весьма легковесный получился, и не хотелось бы вместо XML['mode']['mesh'].Content городить нечто вроде XML['model']^['mesh']^.Content )
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

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...
Правда все объекты нужно будет создать и освободить, но я не вижу в этом никаких проблем.
Аватара пользователя
XProger
новенький
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва
Контактная информация:

Сообщение XProger »

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

Сообщение carrots »

Почему не нужны?
Аватара пользователя
XProger
новенький
Сообщения: 44
Зарегистрирован: 13.08.2007 02:52:28
Откуда: Москва
Контактная информация:

Сообщение XProger »

carrots, не вписываются в общую эстетику кода )
Ответить