|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
Delphi 6-7 Теоретический пробел в TObject.Create01.09.2023, 13:00. Показов 7152. Ответов 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
|
|||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 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
|
||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 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
|
|||||||||||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
||||
| 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
|
|||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
||||||
| 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
|
|||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|||||||||
| 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
|
|||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|||||||||
| 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 на обычный пробел в файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
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) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|