|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
Delphi 6-7 Теоретический пробел в TObject.Create01.09.2023, 13:00. Показов 7409. Ответов 180
Метки нет (Все метки)
Приветствую!
Возник у меня некий теоретический пробел по поводу конструктора TObject.Create. C одной стороны, он ведет себя, как функция, возвращающая указатель на созданный экземпляр. С другой стороны, сам Delphi считает его процедурой. В хелпе указано, что TObject.Create выделяет память, но не инициализирует данные. Но память выделяет. А в исходниках все тело конструктора состоит из begin/end. Правильно ли я понимаю, что этот конструктор - что-то типа разновидности команды для препроцессора, где компилятор Delphi, встречая этот вызов, сам организовывает выделение памяти и возвращение адреса созданного экземпляра?
0
|
|
| 01.09.2023, 13:00 | |
|
Ответы с готовыми решениями:
180
Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
TFilestream.create [cannot create file] |
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 08.09.2023, 18:39 [ТС] | |||
|
По большому счету, компилятор на этапе сборки уже отлично знает про все виртуальные методы и их вызовы. Поэтому вызов конструктора, скорее всего, просто приводил к заполнению таблицы VMT уже собранной информацией.
0
|
|||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
|
| 08.09.2023, 18:45 | |
|
А если конструктор по условию вызывается?
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
| 08.09.2023, 19:02 [ТС] | |
|
0
|
|
|
|
||||||
| 08.09.2023, 19:05 | ||||||
|
ну вот же вариант вызова конструктора по классу, в самом начале программы
и компилятор не знает что класть в result до вызова
0
|
||||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 08.09.2023, 19:17 [ТС] | ||
|
0
|
||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
|
| 08.09.2023, 19:25 | |
|
Э-э... Передавая классовую ссылку мы прямым текстом говорим, что за класс брать. В этом суть классовых ссылок.
А Result на этапе компиляции просто размечается, как ссылка. Это ничем не отличается от превентивного объявления указателя на еще необъявленный тип, или уточнений, что TMyClass=class в начале юнита.
0
|
|
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
|||||||||||||
| 08.09.2023, 22:55 | |||||||||||||
Похоже, что очередной фокус Копперфильда разоблачён. ))) Так что, мы, с Вашего позволения, ещё немного побудем. ))) Но это не отменяет вопроса, если есть свой вариант, было б очень интересно. Добавлено через 5 минут Добавлено через 9 минут
0
|
|||||||||||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||||||
| 08.09.2023, 23:03 [ТС] | |||||||
|
Но походу, это почти то же самое, что было приведено выше
0
|
|||||||
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
|||||||||||||
| 08.09.2023, 23:55 | |||||||||||||
|
Там было вполне полноценное ООП, object и record - две большие разницы, а полиморфизм цвёл в полный рост. Не стоит хаять добротно собранную систему. )) По поводу классов и обжектов, тоже не стоит так примитизировать. Размер object-а ограничивался только возможностями ОС. Никто не запрещал создавать их в куче, со всеми вытекающими. А конструктор - да, был необязателен, если Вы не пользовались виртуальными методами, но зачем тогда... но это уже совсем другая история. Принципиально - всё было возможно. ))) Да! Как я мог забыть! Базовый класс определялся самим программером, как самый старший предок в иерархии. И их могло быть больше одного. Добавлено через 57 секунд Добавлено через 7 минут В первом случае мы вызываем штатный class method TObject-а, который всё равно был бы вызван при "нормальном" вызове Create-а, а теперь, возможно будет проигнорирован Магией. Честно сказать, я не знаю. Мне это пришло в голову и было опробовано пару часов назад, дальше этого я не пошёл. Решил потрепаться на форуме. ))) Добавлено через 14 минут
MyType - необходимый тип. Второй параметр, понятное дело, конструктор. Любой доступный в MyType. Были ещё варианты с тем, что в Си называется кастомизацией, кажется. Ещё какая-то экзотика. Я сейчас уж и не помню на вскидку. Добавлено через 5 минут Добавлено через 13 минут Извините, кусочек текста потерялся. ))))) Я хотел сказать, что с другой стороны такая "рекурсия" вполне может быть допустима, и проверить мы это не можем, так как нам не удастся осуществить такое описание TObject = class(TObject) потому, что TObject уже определён.
0
|
|||||||||||||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
||||
| 09.09.2023, 00:32 | ||||
|
Borland Pascal стал Object Pascal в версии 5.5. Т. е. они подцепили ООП и даже версию мажорную не сменили.
0
|
||||
|
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
|
|||||
| 09.09.2023, 01:30 | |||||
|
Тут кто-то говорил что не понимает зачем такое нужно. Объясню не столько необходимость, сколько возможность. В форуме часто появляются вопросы от новичков, например пишущих тесты. Вопросы типа "Тест пройден. Как мне вернуть всё в начальное состояние?". Если всю инициализацию данных выполнять в OnCreate главной формы, то самое то.
0
|
|||||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
||||||
| 09.09.2023, 01:44 | ||||||
|
Вообще-то методы у записей всего-лишь способ сделать нормальным поиск процедурок подходящих для них, т. к. функционально
Как бы дедуля Вирт не маразматничал в своем маразматичном Обероне по этому поводу.
0
|
||||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||||
| 09.09.2023, 11:55 [ТС] | |||||
|
Мой опыт показывает, что конструктор максимум должен инциализировать статические поля объекта. А все остальное лучше вынести в некую процедуру Init, или какой-нибудь Setup, никто не мешает их несколько написать, для различных условий. Добавлено через 11 минут Запись в виде "колоть(чем, что)" более универсальна (например, "колоть(топором, дрова)"/"колоть(шприц, задница)"))) Тем более, что в примере "дрова.колоть()" есть нелогичность в том, что у объекта "дрова" есть метод "колоть". Хотя метод "колоть" присущ, скорее дровосеку. В этом смысле конструкция, которую предложил XpomAI, более логична - "дровосек.колоть(дрова, топор)". Грубо говоря: MyVar:=TMyClass.Create - это что-то типа: "Эй, класс! Создай мне объект из самого себя!" MyVarL:=New(TMyClass,Create) - "Эй, менеджер памяти! Создай мне объект, описанный классом TMyClass, и вызови его конструктор Create" - последний вариант выглядить гораздо естественней и логичнее.
0
|
|||||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
|||||||||
| 09.09.2023, 13:03 | |||||||||
|
Если я объявил переменную, допустим
Это из разряда, почему в компьютерной игре персонаж часто не может перелезть через метровый заборчик или залезть куда-то через окно. И человека, который до того с компьютерными играми, да и вообще компьютерам, дела не имел это может вогнать в ступор. Он просто не понимает того, что вроде большой мир игры прописан ограничено, и простые в реальности действия в нем могут быть в силу каких-то причин не прописаны. А с др. стороны геймдизайнеры оказываются в ситуации, что надо как-то объяснить игроку, что какое-то обычно невозможное действие конкретно здесь возможно. И в миллионе игр вертикальные поверхности, по которым можно лезть, окрашиваются какой-то одной текстурой, ящики, которые можно открыть, и платформы, на которые можно запрыгнуть, помечены зелеными маркерами. И программисту, имея объект дрова, проще нажать точку и получить список того, что можно сделать с дровами. По крайней мере, что создатель дров предусмотрел. Класс типа Дровосек, в принципе, тоже возможен, например, сюда можно отнести классы соединений с БД. Это хорошо работает, когда есть некоторая большая область, в которой нужно много сервисных действий и централизация. Создавать подключение к БД для каждого набора данных, очевидно, бред, пусть этим один класс занимается.
0
|
|||||||||
|
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
|
||
| 09.09.2023, 13:26 | ||
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||||||
| 09.09.2023, 14:58 [ТС] | ||||||
|
Добавлено через 6 минут
0
|
||||||
|
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
|
|
| 09.09.2023, 16:36 | |
|
Всё же, аналогия "класс - это чертёж, объект - сама деталь, сделанная по чертежу" слишком абстрактная.
У нас "объект" это просто кусок памяти, ссылка на которую передаётся в соответствующие методы объекта. По факту, методы существуют независимо от объекта, сидят прямо в классе, если хотите, но знают, по какому смещению от конкретного адреса найти нужные поля. Итак, создание объекта заключается в том, чтобы выделить память под него. Просто сколько нужно выделять памяти знает конструктор самого класса, то есть, записано в скрытом поле. А в случае с записью это значение просто вбито в скомпилированный код в месте вызова GetMem.
0
|
|
|
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
|
|||
| 09.09.2023, 17:06 | |||
|
Давать им определения лучше через забытое понятие подпрограммы. И процедура и функция это подпрограммы. Функция отличается от процедуры тем, что может быть операндом выражения, а процедура - нет.
0
|
|||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 09.09.2023, 17:17 [ТС] | |||
|
Object'у не требуется конструктор, если отсутствуют виртуальные методы. По большому счету, конструктор был нужен исключительно ради заполнения таблиц VTM и DMT. Память для объекта выделялась стандартными методами, как и для любой переменной. Но потом кто-то решил, что экземпляр класса нужно обязательно создавать в куче (что, как по мне - очень странное решение. Даже страннее, чем все классы порождать от TObject) и совместить (теперь уже ставшим обязательным) выделение памяти с конструктором.Добавлено через 1 минуту
0
|
|||
|
1082 / 520 / 43
Регистрация: 05.05.2022
Сообщений: 3,720
|
|||||||||
| 09.09.2023, 17:42 | |||||||||
0
|
|||||||||
| 09.09.2023, 17:42 | |
|
how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style? CREATE SEQUENCE - ошибка синтаксиса в "CREATE"
В строке заменить пробел между слов на запятую и пробел Заменить неразрывный пробел NBSP на обычный пробел в файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|