Модератор: Модераторы
Дож писал(а):Я хочу получить указатель на конструктор объекта (именно object, а не class), дальше передать его параметром куда-то, и применить этот конструктор для инициализации объекта. Как это сделать (если это вообще возможно)? Чисто гипотетически это возможно, но как это написать на паскале, у меня пока даже идей нет.
Не надо писать, что я хочу странного, мне это нужно для реализации фабрики и я вполне осознаю опасности, связанные с непрямым вызовом конструктора.
Упс, ясно, недоглядел. Извиняюсь.
Хотя, если честно, не понятно, зачем мучиться с object'ами, когда есть class'ы?
Может я что в этой жизни упустил?
Дож писал(а):Каждый отдельный экземпляр класса нужно выделять в куче. Часто возникает необходимость создавать объекты на лету («на стеке») или создавать много однотипных экземпляров в коллекции, в этих случаях использование объектов эффективнее.
Угу, понятно. А как на счёт новых record'ов, которые также, как и классы, могут иметь методы и свойства? Или во FreePascal этой фичи нет, только в Deplhi XE?
MylnikovDm писал(а):вся эта хрень с фабриками классов была придумана для языка C++, поскольку там нет виртуальных конструкторов.
Vapaamies писал(а):Вынужденной платой за упрощение стало размещение объектов только в куче, поскольку разработчики решили не усложнять компилятор полноценным ARC и escape analysis (не знаю для него русского термина).
zub писал(а):В делфи для record`ов доступны виртуальные методы? зачем тогда новые record`ы если есть старые object`ы?
Дож писал(а):Каждый отдельный экземпляр класса нужно выделять в куче. Часто возникает необходимость создавать объекты на лету («на стеке») или создавать много однотипных экземпляров в коллекции, в этих случаях использование объектов эффективнее.
Вы точно уверены, что накладные расходы для "фабрики классов" работающей с объектами будут в данном случае меньше чем при использовании виртуальных конструкторов классов?
При этом и "на стеке" и в коллекции вы средствами штатного компилятора ничего создать не сможете, поскольку в момент компиляции конкретный тип объекта-наследника ещё не известен.
Соответственно, будете использоваться всяческое "шаманство" с ассемблером и прочим (что мы уже наблюдаем в имеющихся примерах).
uses
Objects;
type
TMyObject = object
constructor Init;
end;
constructor TMyObject.Init;
begin
end;
var
O: TMyObject;
begin
CallVoidConstructor(@TMyObject.Init, @O, TypeOf(TMyObject));
end.
2. Из чего следует, что аналогичное "шаманство" нельзя провести с классами, заставив их находиться "на стеке", например, через свой менеджер памяти?
MylnikovDm писал(а):Если вы не знаете, конструктор какого объекта вам на самом деле придёт, то вы не можете выделить необхдимое количество памяти на этапе компиляции. Только в runtime динамически "из кучи". Соответственно, все объекты становятся исключительно указателями. Какие ещё есть варианты?
Vapaamies писал(а):Вместе с VMT вполне можно предусмотреть таблицу смещений полей в теле объекта, и получится полноценный составной объект в памяти. Данную фичу можно сделать опицональной, дав программисту возможность выбирать между использованем указателей, перекладывающим эффективность операций с памятью на менеджер кучи, либо же нести вынужденные расходы на таблицу смещений составных объектов, но получать потенциально более быстрое размещение в памяти большого числа вложенных объектов.
Дож писал(а):Смогу, если у меня в наследниках нет новых данных и нет новых виртуальных методов.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24