Выставить VMT руками

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

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

Выставить VMT руками

Сообщение runewalsh » 07.06.2013 19:41:54

Десериализую граф объектов (которые object).
Некоторые из них имеют VMT. При этом очень не хотелось бы заводить пустые конструкторы только затем, чтобы выставить VMT.
TypeOf возвращает не тот же указатель, что хранится в экземплярах, но близкий — смещение меняется в зависимости от размера VMT.
Как выставить VMT, зная TypeOf?! ;_;
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Выставить VMT руками

Сообщение zub » 08.06.2013 19:16:28

>>При этом очень не хотелось бы заводить пустые конструкторы только затем, чтобы выставить VMT.
А я наоборот не захотел возиться с VMT руками и специально для этого завел пустой конструктор))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выставить VMT руками

Сообщение runewalsh » 09.06.2013 05:07:18

В итоге так и сделал.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Выставить VMT руками

Сообщение alexey38 » 09.06.2013 08:59:25

runewalsh писал(а):Некоторые из них имеют VMT. При этом очень не хотелось бы заводить пустые конструкторы только затем, чтобы выставить VMT.

Что за странная практика программирования, когда хочется использовать технологии в противоречии с идеологией. Не хотите иметь конструкторов, не имейте классов (объектов). Если нужно динамическое создание объектов при десериализации иерархии объектов с учетом наследования, то создавайте виртуальные функции возвращающие либо тип, либо создающие новый объект.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Выставить VMT руками

Сообщение runewalsh » 09.06.2013 12:42:43

alexey38 писал(а):использовать технологии в противоречии с идеологией

Всё равно десериализация в неуправляемых языках была, есть и будет костылём, это нормально.
alexey38 писал(а):то создавайте виртуальные функции возвращающие либо тип

Для object'ов есть только TypeOf — по-видимому, бесполезный. И я не уточнил, что десериализовывать могу не только object'ы некой иерархии, а вообще произвольные типы, даже POD (идентифицируя тип чем-нибудь ещё — строкой или тоже указателем с пометкой, что это ни разу не TypeOf) — частный случай с VMT хотелось бы единожды разрулить в недрах Deserializer.Deserialize, а не гордо светить пустые конструкторы неинтуитивного назначения.
alexey38 писал(а):либо создающие новый объект.

Объект может быть сконструирован "in-place" — непосредственно в данных другого объекта, массиве, etc.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Выставить VMT руками

Сообщение zub » 09.06.2013 13:37:17

>>а не гордо светить пустые конструкторы неинтуитивного назначения.
Зачем городить? Один раз в базовом обжекте определить пустой конструктор - он унаследуется наследниками. Или базового класса нет?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Выставить VMT руками

Сообщение runewalsh » 09.06.2013 14:04:16

zub писал(а):Один раз в базовом обжекте определить пустой конструктор - он унаследуется наследниками.

И правда ведь. Проверял это, но забыл по ходу. ^^"
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25


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

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

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

Рейтинг@Mail.ru