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

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

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

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

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

Сообщение runewalsh »

Десериализую граф объектов (которые object).
Некоторые из них имеют VMT. При этом очень не хотелось бы заводить пустые конструкторы только затем, чтобы выставить VMT.
TypeOf возвращает не тот же указатель, что хранится в экземплярах, но близкий — смещение меняется в зависимости от размера VMT.
Как выставить VMT, зная TypeOf?! ;_;
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>При этом очень не хотелось бы заводить пустые конструкторы только затем, чтобы выставить VMT.
А я наоборот не захотел возиться с VMT руками и специально для этого завел пустой конструктор))
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

В итоге так и сделал.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

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

Что за странная практика программирования, когда хочется использовать технологии в противоречии с идеологией. Не хотите иметь конструкторов, не имейте классов (объектов). Если нужно динамическое создание объектов при десериализации иерархии объектов с учетом наследования, то создавайте виртуальные функции возвращающие либо тип, либо создающие новый объект.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

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

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

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

Объект может быть сконструирован "in-place" — непосредственно в данных другого объекта, массиве, etc.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>а не гордо светить пустые конструкторы неинтуитивного назначения.
Зачем городить? Один раз в базовом обжекте определить пустой конструктор - он унаследуется наследниками. Или базового класса нет?
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

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

И правда ведь. Проверял это, но забыл по ходу. ^^"
Ответить