|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
Можно ли Конструктор и Деструктор вызывать как метод класса?29.06.2019, 12:03. Показов 21978. Ответов 222
Метки нет (Все метки)
Собственно вопрос:
можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса? Например, я хочу управлять очередностью вызовов. См. пример:
0
|
||||||
| 29.06.2019, 12:03 | |
|
Ответы с готовыми решениями:
222
Как правильно вызывать конструктор шаблонного класса? Можно ли явным образом вызывать деструктор? Конструктор и деструктор анонимного класса |
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
||
| 01.07.2019, 00:34 | ||
|
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 00:37 | ||
|
0
|
||
|
Комп_Оратор)
|
||||
| 01.07.2019, 00:42 | ||||
|
Однако по чести говоря _stanislav, не говорил что нельзя использовать. Он говорил что нельзя использовать "как старый объект". А вы обрезали фразу: А я вот не догадался. ![]() Добавлено через 2 минуты
0
|
||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 00:44 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 01.07.2019, 00:49 | ||
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 01:06 | ||
|
0
|
||
|
Комп_Оратор)
|
|||||||
| 01.07.2019, 02:49 | |||||||
0
|
|||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 03:33 | ||
|
0
|
||
|
Комп_Оратор)
|
||||||||||||
| 01.07.2019, 09:55 | ||||||||||||
На стеке оно выделяется тоже типизировано. Хотя где-то внизу всё это байты, биты, атомы кремния... Неоправдонный спуск вниз не будет уместен.
0
|
||||||||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 10:08 | ||
|
Но опять же язык это средство описания тех или иных правил поведения. Есть четкие правила ООП. А именно уничтожения объекта. После вызова деструктора объект считается несуществующим в модели данных. А соответсвенно никто кроме менеджера памяти (в данном случае пересаживателя) ссылок на него иметь после вызова деструктора не должен. А соответственно вопроса со старыми ссылками просто не может существовать если следовать правилам именно ООП а не лисопетидь релятивсистского коня в сферическом вакууме.
0
|
||
|
Комп_Оратор)
|
|||
| 01.07.2019, 10:26 | |||
0
|
|||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||
| 01.07.2019, 11:20 | ||||
|
И это уже забота этой части алгоритма сделать так чтобы все срослось после пересадки (что для типизированных автоматически управляемых буферов практически унриал - автоматика стека неуправляемая). Полноценно работать это может только с управляемой программистом автоматикой - т.е. буферами на куче, алгоритм удаления которых полностью кастомизируем. А пересадка в них ничем не отличается от вызова delete для старого объекта и new для нового, кроме экономии времени на синхронизацию доступа и рытье по куче. Точно так же если new вернул тот же адрес который был у удаленного старого объекта (а такое происходит на каждом шагу - куча это хранилище буферов старых объектов для последующего переиспользования) - это будет старый объект или новый? Добавлено через 38 минут Взял я знач у менеджера памяти буфер скока мне надо. А потом с ним что хочу то и ворочу. Это моя память что хочу с ней то и делаю - захотел инстансы селю захотел менеджеру кучи отдал. Никто мне в этом не указ. Это так вектор думает. И эту цепочку можно до бесконечности вкладывать одно в другое как матрешки. А откуда пришел буфер конструктору того знать не положено, так же как и деструктору то что с буфером после него будет. У одного задача сделать из вот конкретно этого куска памяти инстанс. А у второго сделать чтобы инстанса вот в этом конкретном куске больше не было. А чей этот кусок и кто решил там инстанс поселить/выселить - не их забота.
0
|
||||
|
Комп_Оратор)
|
|||
| 01.07.2019, 11:36 | |||
|
Модель ООП требует определения, для использования в данном разговоре. Объект его похоже уже утратил. Поэтому разговор столь холиварен. Однако если модель, как вы говорите - это такие кулисы с тем что им может быть "всё равно", то сборщик мусора, это мелочь. Добавлено через 12 минут Для кучи это не актуально. Там вызов деструктора ни как не должен повлечь скрытый delete. Или может и такое статься? Именно эти соображения и могут быть решающими аргументами в данном разговоре. Но с точки зрения корректности. Если автомат столь своенравен, то работа с ним напоминает ковыряние пальцами в скоростной мясорубке. На ходу. Нужны понимание и хорошая реакция. А с точки зрения считать ли их одним объектом в случае успеха - это не аргумент, мне кажется.
0
|
|||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||
| 01.07.2019, 11:52 | ||||
|
Т.е. erase у вектора инстанс уничтожает? Уничтожает. А буфер нет. Вообще буфер и инстанс в общем случае абсолютно независимы в плане времени жизни. К примеру в том же векторе при вызове erase инстанс уничтожается а буфер нет. т.е. буфер живет дольше инстанса. А при реаллоке вектора инстансы переселяются в новый буфер а старый буфер уничтожается. т.е. инстансы живут дольше буфера. Вообще именно поэтому в англоязычной литературе для экземпляра класса используется термин инстанс а не объект (строго говоря экземпляр класса вообще субъект а не объект). Т.е. instance это термин из ООП а object из описания языка/менеджмента памяти. И ничего общего они вообще не имеют. Единственное что их связывает - перед уничтожением буфера из него должны быть так или иначе выселены все инстансы ( уничтожены или переселены в другой буфер). А суть их уничтожения соответственно разная. Уничтожение инстанса это отвязка его от модели, высвобождение владеемых ресурсов и т.д. манипуляции обеспечивающие безопасность перзаписи буфера другими данными. Ну а уничтожение буфера это банально занесение его в очередь пустых буферов годных к переиспользованию (для кучи или кастомных субкуч) или вообще банально откат регистра sp для буферов на стеке. Добавлено через 5 минут А после скопа когда отработает автоматика стека мы то и пересадить ничего не сможем потому что адрес буфера уже не доступен (прицельный выстрел термоядерной бомбой в ногу путем запоминания адреса в указателе из вышестоящего скопа как вариант не рассматриваем ). Так что лучше этот вопрос оставить автомату стека который именно этим вопросом и занимается, а не чем то другим.
1
|
||||
|
Комп_Оратор)
|
||||||||
| 01.07.2019, 12:10 | ||||||||
|
Ну хорошо. Fulcrum_013, давайте сузим вопрос, чтобы сохранить корректность и сблизить семантику противостоящих сторон. Вот так ссылка указывает на один объект или на разные, с вашей точки зрения и почему:
0
|
||||||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||||||
| 01.07.2019, 12:57 | ||||||||||
|
мало того в чем разница вот с этим?
00CFAA90:instance createdИсключительно в том что буфер был занесен в очередь и извлечен из нее между разрушением старого и созданием нового инстанса. Добавлено через 8 минут Хотя в общем и на стеке можно те же финты ушами творить с поселением в буфер инстансов и т.д. только смысла нет самому ловить когда оные инстансы похоронить не забыть надо. Проще этот буфер в класс обернуть, описать как выселять, поселить на стек и не парится по поводу когда выселять. Добавлено через 16 минут Добавлено через 7 секунд
0
|
||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 01.07.2019, 13:19 | |||
|
Хотя изначально я указал не правильную причину содержания UB, за что приношу свои извинения. Изначальный мой "аргумент" был таков что UB будет из-за того что был вызван деструктор, но это не так. Тем не менее, UB все же есть, но по другой причине. Разберемся почему: Тот прием который ты использовал вполне легальный, но только если объект для которого использован данный прием отвечает определенным требованиям, иначе это UB. В твоем примере используется std::string, реализация которого не определена по стандарту. А раз реализация не определена, значит и не определено то, попадает ли реализация std::string под те самые правила, которые являются исключением при использовании этого приема. Вот эти правила: https://timsong-cpp.github.io/... sic.life#8 там так же написано что этот объект является новым. есть документ исходя из которого определяется что есть что в С++ так вот, в этом документе сказано что теперь в storage который был reused, находится новый объект другое дело если тебе это кажется не логичным - тогда я тебя где-то пойму но ты так говоришь словно выдаешь это за "В С++ это считается одним и тем же объектом" а это создает впечатление что у тебя какой то свой С++, вот с этим я и не согласен какие еще тебе объяснения нужны, если в официальном документе это считается новым объектом
0
|
|||
|
Комп_Оратор)
|
|||||
| 01.07.2019, 13:58 | |||||
|
Но семантически ссылка - синоним объекта и если код валиден, то ссылка указывает на разные объекты, иначе нужно считать ссылку просроченной (невалидной). Другой поддержки для вашей логики я не вижу. А вот это: Fulcrum_013, я уж не говорю о том, что освобождение памяти и в случае когда она выделялась для конструктора объекта, непосредственно, не выгодна если есть только запуск деструктора. Это просто неэффективно. Да и практика это показывает. Но я согласен, и решил данный вариант не рассматривать намеренно. Разрабы компиляторов не идиоты. Но конкретный разраб может иметь мотивы в виде обострения геморроя или денег от конкурента... или еще что-то. Поэтому пусть речь именно о буфере в куче. Тут модель ООП не убеждает. Компилятор её реализует и нужны убедительные доводы, которые показывают механизмы такой реализации (на самом верхнем уровне, - хотя бы логику). То есть, зачем компилятору это желать. Слепая вера (в ООП), живущая в его сердце - не аргумент. Аргументы - быстродействие, надёжность, экономия памяти. Добавлено через 10 минут Добавлено через 7 минут Я хочу понять логику. И понять почему вместо определения есть простыня. Объект, - базовое понятие. Это плохой путь в принципе, так как написать непротиворечивую простыню, это очень сложная задача. По крайней мере если сравнивать с определением. Но так поступают если решили создать неоднозначное но оставляющее свободу для манёвра поле. Или скрыть недостатки логики. Или не понимают, что такое базовое определение, вообще.
0
|
|||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 01.07.2019, 14:05 | |||
|
Добавлено через 3 минуты
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 01.07.2019, 14:08 | |||
|
Вы когда пишите код на С++ вы не принимаете во внимание стандарт? С каких пор вообще стандарт это не аргумент понять не могу насчет логики я выразил свою позицию здесь https://www.cyberforum.ru/cpp-... st13691470 и чем она "не подходит" я тоже не понимаю думаю проблема понимания логики в том что вы зациклились на С++ и рассуждаете с той точки зрения что у вас есть доступ к памяти в языках с виртуальными машинами над адресами реже думают когда рассуждают объектами каждый new - приводит к конструированию нового объекта о чем свидетельствует вызов конструктора а конструктор не вызывается никак иначе кроме тех случаев когда вы формируете новый объект
0
|
|||
| 01.07.2019, 14:08 | |
|
Зачем нужны конструктор и деструктор класса? Дописать конструктор и деструктор для класса Для класса задать конструктор и деструктор Конструктор (деструктор) у класса, не имеющего тип Создание класса с перегрузкой операторов конструктор и деструктор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|