>>но все объекты (инстансы классов), всегда создаются в динамической памяти, и не передаются как ссылки.
Опа! Там нельзя объявить синглтон? Становится всё интереснее.
А для чего нужен модификатор override? Сперва я полагал, что это какая-то альтернатива virtual, но гляжу что virtual тоже имеется.
Особенно интересно, применительно к конструкторам и деструкторам. Делфи по умолчанию не допускает совпадающих имён функций у наследуемого класса, причём это конструкторов\деструкторов касается? Или я не так понял?
g-cont
> Опа! Там нельзя объявить синглтон? Становится всё интереснее.
можно конечно.
старое доброе название "глобальная переменная"
так например "Application" - это синглтон.
или какой-нить
var
Form1:TForm1;
синглтоны, но при это теже самые объекты
g-cont
> А для чего нужен модификатор override? Сперва я полагал, что это какая-то
> альтернатива virtual, но гляжу что virtual тоже имеется.
переопределять виртуальные методы в наследниках.
g-cont
> Подсажите, что это вообще такое?
> TRefGUID = packed record
Типа да, struct с union в конце. До case могут идти обычные поля, после case - объединенные в одну область памяти, Integer или любой перечислимый тип пишется от балды, вроде афтар Паскаля хотел контролировать тип значения, потом плюнул и забыл.
> Следующий вопрос. В Делфи нет ссылок, как я понял. Как он понимает какой аргумент функции надо скопировать, а на какой сослаться?
Аргументы, перед которыми var - переменные аргументы, то есть ссылки. В них нельзя передавать значение, только переменную
> Или всё что класс - автоматически делается ссылка
Дельфовый class - это указатель, экземпляр создается только на heap
> Опа! Там нельзя объявить синглтон?
Врядли. Есть глобальные переменные, но не запретишь множественное создание, как в цэплюсе.
> А для чего нужен модификатор override?
Перегрузка вирт функций, подробности в Borland Help
> Делфи по умолчанию не допускает совпадающих имён функций у наследуемого класса
Делфи допускает перегрузку функций, насколько помню с давнего опыта
g-cont
> Особенно интересно, применительно к конструкторам и деструкторам.
ну деструктор всегда виртуальный. (оно очевидно и потребно).
виртуальный конструктор используется для динамического создания объектов.
Когда класс от которого создаётся объект передан классовой переменной.
g-cont
> Делфи по умолчанию не допускает совпадающих имён функций у наследуемого класса,
> причём это конструкторов\деструкторов касается? Или я не так понял?
пост выше.
или указывай явно overload, или пиши override.
Можно ещё reintroduce, но это необхдимо для OOП.
Aslan
> Врядли. Есть глобальные переменные, но не запретишь множественное создание, как
> в цэплюсе.
можно, что-то типа такого:
type TMySingleton = class end; var Singleton: TMySingleton = nil; implementation constructor TMySingleton.Create; begin if Assigned(singleton) then raise Exception.Create( 'no good'); inherited Create; Singleton := self; end; end.
g-cont
> Хочу использовать формат этих компонентов в качестве базы для своего GUI на
> первое время
А Object Inspector там будет?
Aslan
> А Object Inspector там будет?
имхо, ради этого каша и заваривается
skalogryz
Загадка природы - как сделать в Сишке property и рефлексию и метаклассы и сриализацию
Aslan
> Загадка природы - как сделать в Сишке property и рефлексию и метаклассы и
> сриализацию
легко! выкинуть Сишку и писать на Паскале.
но я уверен, что g-cont момент с сериализацией и rtti продумал
Ладно-ладно, там не настоящий С++. Там виртуальная машинка с синтаксисом С++. Так что с метой и конструкцией классов на лету проблем не будет.
Тему переименовал буду тут свои вопросы задавать. Как правило в учебниках об этом или не пишут или настолько косным языком, что ничего не понятно.
а я вот не понял. если тебе только dfm распарсить, нафига тебе дальше в делфи лезть?!
или ты портируешь чей-то код?
g-cont
> Ладно-ладно, там не настоящий С++. Там виртуальная машинка с синтаксисом С++
...на делфи написали керстовиртомашину?!
Aslan
> Загадка природы - как сделать в Сишке property и рефлексию и метаклассы и сриализацию
а ещё подумалось, что постоянно ходят и ноют, дескать - "паскаль - хлам, потому что там begin и end".
так вот, прикрутить таки некий транслятор, из си-синтаксиса в паскаль синтаксис.
Естественно, получится не тот самый честный Си(++), но что-то Си-образное, что будет в паскаль транслироваться.
g-cont
> Ладно-ладно, там не настоящий С++. Там виртуальная машинка с синтаксисом С++.
> Так что с метой и конструкцией классов на лету проблем не будет.
Нет там никакой виртуальной машины, С++ Builder просто-напросто, умеет линковать объектники от Delphi. При этом, если наследоваться от VCL классов - получается эпичный глюкодром.
g-cont
> А для чего нужен модификатор override? Сперва я полагал, что это какая-то
> альтернатива virtual, но гляжу что virtual тоже имеется.
если нужна виртуальная функция, то в родительском классе ее помечают virtual, а в наследниках - override. Если нужны две функции с одинаковым именем но разными параметрами, то помечается overload. Есть еще reintroduce, но в исходниках vcl он вроде не встречается.
>>а я вот не понял. если тебе только dfm распарсить, нафига тебе дальше в делфи лезть?!
Нормальные люди учат язык чтобы писать на нём программы. Я пишу конвертор исходного кода Delphi->C++ чтобы не учить язык. Возникла такая необходимость. Конвертор я напишу примерно за неделю, а глаз за непривычные конструкции Delphi будет минимум пару месяцев цепляться - экономия времени.
>>...на делфи написали керстовиртомашину?!
Я делфи вообще не знаю. Виртмашина на С++ написана, с синтаксисом С++. Смысл замуты - расширенная метаинформация и конструирование новых классов на лету, ну и сериализация конечно. Ну корочи стандартный набор ништяков VM + привычный синтаксис.
>>Нет там никакой виртуальной машины
Там - нет. А у меня есть.
>>если нужна виртуальная функция, то в родительском классе ее помечают virtual, а в наследниках - override
В крестах override тоже появился, с 17-й штоли версии. До этого оставалось только надеяться, что компилятор сам всё правильно поймет.
>>две функции с одинаковым именем но разными параметрами, то помечается overload
Вроде как это опциональный модификатор с которым дедуктор становится умнее что ли. Ну я так это понял из корявого описания в учебнике.
>>Есть еще reintroduce
Это когда метод в наследнике принудительно выбрасывают из vtable?
Так, вроде бы всем ответил, теперь новая порция вопросов :)
>>но все объекты (инстансы классов), всегда создаются в динамической памяти, и передаются как неявные ссылки.
А если я объект на стеке создаю? Всё равно будет в динамической памяти размещён?
Итак, по аргументам функции, как я понял:
1. На объекты всегда автоматически формируется ссылка
2. На любые другие типы ссылка формируется, при наличи модификаторов const и var, соответствуют const & и &
Как устроены массивы в делфи? Статичные понятно, даже если там указан отрицательный диапазон, достаточно сделать ремап.
Есть ли в делфи динамические массивы? Кто-то мне вроде говорил, что нету, но может я неправильно понял.
Указатели на функции. Типичный вариант выглядит как-то так:
FnFreeFunc = procedure(ptr: Pointer); cdecl;
Тут вопросов нет. Но иногда в конце идёт приписка of object;
Т.е., как я понимаю указатель на функцию, являющуюся членом произвольно класса?
Структуры в Delphi являются аналогом структур в Си? Там нельзя объявлять функции или классы?