|
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] |
|
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
|
||
| 07.09.2023, 17:09 | ||
|
Да, был. Но, во-первых, constructor появился до введения классов. И при этом был процедурой. Во-вторых, он продолжает работать как процедура. В-третьих, сама Дельфи считает TObject.Create процедурой (это я цитирую сам себя, как и Вы, собственно). Посему приведённый ответ, как мне кажется, следует считать как минимум неточным, и уж точно - неудовлетворительным. А вообще, я ж уже говорил -
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 07.09.2023, 17:22 [ТС] | |||
|
0
|
|||
|
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
|
||
| 07.09.2023, 17:38 | ||
|
0
|
||
|
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
|
|||||||||||||||||
| 08.09.2023, 02:26 | |||||||||||||||||
|
Вот например.
Второй вариант:
Добавлено через 2 минуты Ну да. Это тоже магия компилятора. Примите и прочь!
0
|
|||||||||||||||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 08.09.2023, 06:47 | |
|
Что-что, во 2-ом случае? А AV по чайнику? Класс со структурой не путайте.
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 08.09.2023, 09:29 [ТС] | ||
|
0
|
||
|
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
|
|
| 08.09.2023, 10:55 | |
|
0
|
|
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 08.09.2023, 11:19 | |
|
Что значит, "предполагается"? Под класс память при объявлении не выделяется до вызова конструктора, под структуру выделяется.
За object из TP говорить не буду, не использовал. Полагаю, что там как в C++, где никаких классов нету, есть только объекты идентичные структурам, но тогда меня давно занимает вопрос, на фига все эти навороты в Delphi прикручивались к структурам версии так с 2005-ой, и что мешает просто уравнять object и record, сразу давая структурам еще и наследование. Структура - это общеязыковой термин, а что там в Паскале их record назвали, это вопросы к дедуле Вирту.
0
|
|
|
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
|
|||||||
| 08.09.2023, 11:27 | |||||||
0
|
|||||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 08.09.2023, 12:06 [ТС] | |||
|
Добавлено через 1 минуту
0
|
|||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
||
| 08.09.2023, 13:52 | ||
|
В Delphi любой класс обладает всеми свойствами и методами TObject. Это логично, каждый класс должен что-то обязательно уметь, например, возвращать свое имя, записывать себя в виде человекочитаемой строки. И вообще о чем спор? В Delphi базовый класс называется TObject. В др. языке он может называться CClass, в 3-ем вообще никак. Но с точки зрения удобства проще, когда этот класс есть, и можно просто в справке посмотреть, например, инфу по TObject, а не по какому-то базовому классу. И такой класс можно явно объявить. Вот надо мне может его.
Добавлено через 42 минуты А вообще по правилам Delphi можно игнорировать возвращаемое функцией значение, в конструкторе же, помимо неявного выделения памяти есть явные действия кодера. Можно, например, создать там файл, поместив его имя в одно из свойств класса. И тут уже возможен вариант, что может этот файл будет нужен и тогда экземпляр с его именем надо сохранить, а может записали и забыли, и соответственно не стали получать ссылку на экземпляр связанного с ним класса. Т. е. конструкция TMyClass.Create сама по себе может иметь смысл, компилятор же, не видя LValue, пропускает генерацию выделения памяти и возврата результата. Как с полями экземпляра быть внутри конструктора, мне непонятно, под них память запросить у ОС надо заранее, возможно, что она возвращается. Ну и сама по себе цепочка конструкторов по inhereted, во-1, она, в отличие от Ц++ абсолютно произвольна, можно inherited в условие засунуть, во-2, а в какой момент там память выделяется? Очевидно, что все поля под которые надо выделить память, известны в момент вызова первого конструктора, от класса экземпляр которого создается. Цепочка же inhereted Create, если она есть, ничего выделять не должна, делая только то, что явно программист написал.
0
|
||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
| 08.09.2023, 14:29 [ТС] | |
|
0
|
|
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 08.09.2023, 16:01 | |
|
Я не понимаю вопроса. В Delphi сделали так. Что базовый класс определен под именем TObject. Это ничем не отличается от того, что в стандарте языка определена, например, функция вычисления синуса. В Delphi существуют классовые ссылки из этого вытекает, что абсолютно любой класс в Delphi должен уметь себя идентифицировать.
Если в др. языке программирования аналог TObject явно не определен, но любой класс тоже имеет какой-то базовый функционал, то я не вижу никаких отличий от Delphi, более того, в Delphi можно и просто TMyClass=class написать, вообще не думая ни о каком TObject. В чем вопрос-то? В отличиях класса от объекта и структуры?
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||
| 08.09.2023, 16:30 [ТС] | ||
|
В общеязыковом понимании, базовый класс - это класс, у которого нет предков, т.е., нет неявно прицепленного функционала, который цепляется паравозом ко всем классам-потомкам. А самый первый вопрос (с которым уже разобрались) - что такое Create с точки зрения Object Pascal? Фактически являясь процедурой, ведет себя, как функция, несмотря на то, что в исходниках не возвращает никакого значения. При этом такой же самый constructor, но уже применительно к object'у, ведет себя вполне ожидаемым образом.
0
|
||
|
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
|
||||||||||||
| 08.09.2023, 17:44 | ||||||||||||
0
|
||||||||||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
|
| 08.09.2023, 17:45 | |
|
1) Процедура это функция, не возвращающая обязательно результата.
void Proc(int a); В терминах Ц, как языка, вообще нет таких зарезервированных словОВ, как procedure и function. Да и в Delphi, я считаю, давно пора разрешить писать function F(A:Integer); С др. стороны, void Proc(int a; int * b); И о ужас, она что-то в b может возвращать. А может и не возвращать, и вообще работать именно с указателем на b, по объяве не поймешь, но это проблема Ц, что в нем даже такие вещи, через ж*** сделаны. В Delphi я в таких случаях пишу out вместо var, если результат обязателен, т. е. переданная переменная будет изменена. Честно, не помню всех отличий м/у var и out. Так что это чисто культурный подход. В Паскале значение функции надо было присваивать чему-то, в Delphi это убрали и использовать функцию, как процедуру возможно, особенно, если это какая-то фигня с результатом, которой неясно, что делать. Т. е. отличия уже условны. Конструктор в Delphi возвращает ссылку на экземпляр, хотя есть и class constructor, т. е. он в терминах Паскаля является функцией. Но можно сказать, что это не процедура и не функция, а что-то иное. В юнитах, например, есть секции initialization/finalization, которые вообще непонятно что, но похожи на классовый конструктор с деструктором. В общем, классифицировать можно по-разному, а о терминах договариваются. Вопрос не в этом, а что мы вообще от языка хотим? Мы хотим, чтобы у нас абсолютно любой класс умел в некий набор действий, или мы хотим, чтобы у нас объект ТОЧКА, состоящий из вещественных значений координат X и Y сидел на стеке и занимал в памяти столько, сколько нужно для хранения этих 2 чисел? Я по Object Pascal в редакции TP 7 лишь книжку читал во время учебы, в т. ч. про ООП, я помню, что там тоже было наследование, деление по доступу, но в общем-то всё. Возможно, что там все было реализовано без базового класса, т. е. фактически получался record, но с методами и добавлением полей и методов через наследование. Если п****, поправьте. Но я так понимаю, что в этом и есть разница м/у классами, которые большие, создаются в куче только при вызове конструктора, и доступны по ссылке и объектами, которые прям при объявлении создаются в памяти, и конструктор им нужен только для инициализации. В такой системе, как я понимаю, сделать тот же полиморфизм невозможно, т. к. все уже создано, или будет создано в стеке сразу при вызове, исходя из размеров объявленной переменой объекта. Кто спец по Ц++ и его объектной модели, может пояснить, как они там с этим живут.
0
|
|
|
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
|
|
| 08.09.2023, 17:46 | |
|
Я уже давно принял тот факт, что многое из того, что якобы описано в модуле System.pas - является магией компилятора.
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
||||||
| 08.09.2023, 18:18 [ТС] | ||||||
|
И по объявлению все понятно - void - аналог паскалевского procedure, признак функции - это явное указание типа.
0
|
||||||
|
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
|
||||
| 08.09.2023, 18:32 | ||||
|
0
|
||||
| 08.09.2023, 18:32 | |
|
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
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|