
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.34] |
![]() |
|
Страницы: (245) « Первая ... 242 243 [244] 245 ( Перейти к последнему сообщению ) |
Сообщ.
#3646
,
|
|
|
Цитата Shaggy @ мне сказали, что конструкция make_shared<int>(42); выдаёт объект со счётчиком=1 далее следует присвоение, и следовательно... ...счётчик равен 2, но потом временный объект, созданный функцией make_shared, умирает и тем самым уменьшает счётчик на 1, и остаётся только объект x со счётчиком 1. Ну, вы бы тоже не смогли, если бы попрограммировали на других языках с подсчётом ссылок. |
![]() |
Сообщ.
#3647
,
|
|
Цитата Shaggy @ тогда не понял. т.е. не может существовать двух ссылок(сырая и shared), указывающих на один объект? Может, только обычно они являются внешними по отношению к объекту и его типу, а не встроены каким-либо образом в него. Мухи отдельно, котлеты отдельно. Фреймворки бывают разные и зачастую недостаточно гибкие. И тебе не кажется, что вопрос "зачем это делать?" --- это не ответ на вопрос "почему так делать --- дурной тон?" и уж тем более никак не катит на "разжевывание". Я бы еще понял, если бы ты привел пример, когда ручной доступ к БД параллельно с фреймворком, скажем, нарушает целостность данных в БД. Я и не использую фреймворки. С этим никто не спорит, но из-за такого устава монастыря ходить в него совсем не хочется, а приходится иногда. Да и самому монастырю следовало бы понять, что он таки не один на Земле и далеко не ее пуп. Конкуренция, да. Большинство языков не подменяют чужие понятия своими. Если им хочется что-то сделать "не как у всех", они придумывают новые понятия, дабы не создавать путаницу. Например, делфисты любят рассказывать, какое Делфи "компонентно-ориентированное", вот и использовали бы вместо слова "interface" слово "component", хотя оно не совсем точно отражало бы суть, но зато без путаницы. |
![]() |
Сообщ.
#3648
,
|
|
шикарное решение ![]() а если переписать так? ![]() ![]() function Main:ICyclic; begin Result := TCyclic.Create('Foo'); Result.SetLink(@Result); // оопс! Result.GetLink^.PrintLn; end; т.е. корректность работы зависит от того где вызван SetLink, в или за Main Цитата MyNameIsIgor @ ...счётчик равен 2, но потом временный объект, созданный функцией make_shared, умирает и тем самым уменьшает счётчик на 1, и остаётся только объект x со счётчиком 1. ээ... а с чего вдруг он умирает? за ов он ещё не вышел... и ещё(просто интересно), зачем нужна ещё одна прокладка(make_shared)? конструктора shared_ptr недостаточно? |
![]() |
Сообщ.
#3649
,
|
|
Цитата Shaggy @ т.е. корректность работы зависит от того где вызван SetLink, в или за Main Как будто со слабыми ссылками будет по-другому... Добавлено Цитата Shaggy @ т.е. корректность работы зависит от того где вызван SetLink, в или за Main Кстати говоря, ты можешь убрать вызов SetLink и посмотреть, что будет. Добавлено И еще можешь сделать так: ![]() ![]() function Main: ICyclic; begin Result := TCyclic.Create('Foo'); Result.SetLink(@Result); Result.PrintLn; end; procedure RealMain; begin Main; end; begin RealMain; ReadLn; end. Т.е. указатель тут как бы совсем не причем. |
Сообщ.
#3650
,
|
|
|
korvin, да вроде ничего криминального.
Напоминает ![]() ![]() auto v = 1; auto r = new int(v); Добавлено Это я про limbo. |
![]() |
Сообщ.
#3651
,
|
|
Цитата Shaggy @ Троль не может нравится по определению. Тон у меня деловой, резкий, но не оскорбительный. Так что у нас разное представление определения "как взрослые люди".Qraizer, тебе я вижу, не понравилось? так может оставишь этот снисходительный, менторский тон и поговорим нормально, как взрослые люди? От же ж. Порог не определяется количественно, он определяется прилагательными. Я считаю это пояснением к вопросу о пороге. Аргументом это можно рассматривать, если относиться к нему как факту. Но один факт ещё не статистика. Собственно за неимением оной вопрос о пороге и был задан, иначе было бы утверждение, а не вопрос. А вот дельфисты утверждают, а не спрашивают о, высокий уровень порога вхождения в Плюсы, и не только я вижу тут противоречие. Shaggy, мне в целом коллинеарно, что там хотел написать korvin, что вместо этого написал, и где в результате словил грабли. Поднятый мною вопрос поначалу касался только счётчика ссылок с бредовым начальным значением, затем бредового факта отсутствия владельца для этого счётчика, затем бреда о нормальности подхода к ручному допиливанию функционала, для избавления от которого этот функционал вообще-то и вводился, и только наконец -- воспринятия горы проблем из-за всего этого за нормальное проектное решение уровня архитектуры языка. Мне вот интересно, ну создала фабрика мне объект по интерфейсу на него, счётчик 0, тут бац! эксепшн. Никакого перехода 1→0 в принципе никогда не состоится. И как теперь? Но это ещё мелочи. Что говорят архитекторы самой COM не интересно почитать? |
Сообщ.
#3652
,
|
|
|
Цитата Shaggy @ ээ... а с чего вдруг он умирает? за ов он ещё не вышел... "ов" - это область видимости? Она тут ни при чём (точнее, при чём, но распространяется на объект x), временные объекты живут до конца statement. Напомню, код мы обсуждаем вот такой ![]() ![]() auto x = make_shared<int>(42); Для пример, есть у нас функция, возвращающая экземпляр некоего типа T ![]() ![]() T foo() { return T(); } Если вызвать её вот так ![]() ![]() foo(); то возвращённый объект сразу умрёт. Если так ![]() ![]() T t = foo(); то возвращённый объект будет использован при создании объекта t, а потом так же умрёт. Цитата Shaggy @ и ещё(просто интересно), зачем нужна ещё одна прокладка(make_shared)? конструктора shared_ptr недостаточно? Во-первых, это некоторый сахар - не надо два раза писать тип ![]() ![]() shared_ptr<MyType> p(new MyType(arg1, arg2, arg3)); auto p = make_shared<MyType>(arg1, arg2, arg3); Во-вторых, делает более лаконичными некоторые случаи при обеспечении безопасности относительно исключений. В-третьих, это небольшая оптимизация - память под счётчик и объект выделяется одним куском. |
![]() |
Сообщ.
#3653
,
|
|
Цитата Shaggy @ Он временный. Безымянный. Время жизни таковых простирается (грубо говоря) до ближайшей ;.а с чего вдруг он умирает? за ов он ещё не вышел... Цитата Shaggy @ Достаточно. Просто так удобнее. зачем нужна ещё одна прокладка(make_shared)? конструктора shared_ptr недостаточно? Добавлено А, ну вот MyNameIsIgor решил описать не грубо говоря. |
![]() |
Сообщ.
#3654
,
|
|
Цитата korvin @ Может, только обычно они являются внешними по отношению к объекту и его типу, а не встроены каким-либо образом в него. Мухи отдельно, котлеты отдельно. ??? Цитата korvin @ Я бы еще понял, если бы ты привел пример, когда ручной доступ к БД параллельно с фреймворком, скажем, нарушает целостность данных в БД. достаточно того, что может нарушить Цитата korvin @ Я и не использую фреймворки. слишком конкретное мышление - болезнь программистов и юристов да ![]() это была аналогия Цитата korvin @ Да и самому монастырю следовало бы понять, что он таки не один на Земле и далеко не ее пуп. Конкуренция, да. да, конкуренция. не используй, победи в конкурентной борьбе ![]() такое впечаетление, что тебя заставляют писать на delphi. из-за него от тебя девушка ушла и вообще, жизнь под откос покатилась ![]() Цитата korvin @ Большинство языков не подменяют чужие понятия своими. пример был взят с СОМ, чъё он порождение? ну и в качестве бонуса - хоть какой-то, но стандарт Цитата korvin @ Как будто со слабыми ссылками будет по-другому... код будет чище, без @ и ^ а так да Цитата korvin @ Кстати говоря, ты можешь убрать вызов SetLink и посмотреть, что будет. Цитата korvin @ Т.е. указатель тут как бы совсем не причем для чистоты эксперимента замени writeln на OutputDebugString и смотри окно Event Log |
![]() |
Сообщ.
#3655
,
|
|
Цитата D_KEY @ да вроде ничего криминального. Ничего, только (внешне) это напоминает как раз ![]() ![]() auto v = 1; auto r = &v; Цитата Shaggy @ ??? Что тут непонятного? Ссылка на объект в тех же плюсах, хоть сырая (сырой указатель), хоть умная --- это отдельный от основного объект. Ты не наследуешься от shared_ptr или любого другого *_ptr, а строишь свою иерархию как тебе удобно, хоть с интерфейсами, хоть без. А уже потом, когда дело доходит до создания, управления временем жизни объекта и использования, ты сам выбираешь где и как тебе поступить. Явным образом. Цитата Shaggy @ что может нарушить Да, таких фреймворков стоит избегать. Цитата Shaggy @ слишком конкретное мышление - болезнь программистов Здрасте, приехали. Вот так сюрприз. Значит зря в той же SICP рассказывается об абстракциях? Значит зря мы используем объектно-ориентированный, обобщенный и другие подходы к программированию? Да и вообще зря программируем, ведь это ничто иное как абстрагирование деталей реального мира в компьютерную модель. Цитата Shaggy @ да, конкуренция. не используй, победи в конкурентной борьбе Так практически никто и не использует, кроме ситуаций, указанных чуть ниже. Цитата Shaggy @ такое впечаетление, что тебя заставляют писать на delphi Отчасти так и есть. Legacy-софт, legacy-DBFки, тоже еще одно порождение воспаленного мозга. Цитата Shaggy @ пример был взят с СОМ, чъё он порождение? Майкрософт? И? Цитата Shaggy @ ну и в качестве бонуса - хоть какой-то, но стандарт Стандарт чего и где? Как это все связано с ЯП? |
![]() |
Сообщ.
#3656
,
|
|
Цитата MyNameIsIgor @ временные объекты живут до конца statement. вот. этого я незнал. спасибо в delphi это не так(я про интерфейсы естественно) объект будет жить до конца ов Цитата Qraizer @ Троль не может нравится по определению. спасибо доктор Цитата Qraizer @ Тон у меня деловой, резкий, но не оскорбительный намеренное коверканье названия компании-производителя, вероятно, является признаком деловитости как и цель этого действа Цитата Qraizer @ Так что у нас разное представление определения "как взрослые люди". очевидно Цитата Qraizer @ От же ж. Порог не определяется количественно, он определяется прилагательными т.е. объективно не измеряется, а следовательно ценность ответа стремится к 0 Цитата Qraizer @ Мне вот интересно, ну создала фабрика мне объект по интерфейсу на него, счётчик 0, тут бац! эксепшн. Никакого перехода 1→0 в принципе никогда не состоится. И как теперь? Но это ещё мелочи. Что говорят архитекторы самой COM не интересно почитать? вот об этом я и говорил, пишешь о том чего не понимаешь Цитата Qraizer @ Мне вот интересно, ну создала фабрика мне объект по интерфейсу на него, счётчик 0, тут бац! эксепшн. Никакого перехода 1→0 в принципе никогда не состоится. И как теперь? какая фабрика? по какому интерфейсу? что за ересь? объект создаёт конструктор. всегда! и не важно, реализует объект какие-либо интерфейсы или нет, есть у него счётчик или нет пока это просто объект с ручным управлением временем жизни и работать с ним можно как с обычным объектом delphi, а в конце удалить, ручками если эксепшн в конструкторе, вызовется деструктор если после, то может быть утечка, если исключение не обработать если объект реализует интерфейсы, у него есть служебные методы если собирается вести подсчёт ссылок у него есть поле под счётчик =0(после того, как отработает конструктор), а служебные методы соответсвенно изменяют этот счётчик в ту или иную сторону можно подёргать эти методы ручками(они в public), ни к какому автоматизму это не приведёт и объекту насрать, есть переход 1->0 или нет (это нормальное поведение, так и задумано!) автоматизм начинается, когда мы запрашиваем у объекта интерфейс появляется интерфейстная ссылка, а следовательно компилятор автоматически вызывает _addref, который в свою очередь увеличивает счётчик(но может делать что угодно, что напишете то и будет) после этого про объектные ссылки нужно забыть и работать только через интерфейс(ниже дополнено) т.е. по сути весь автоматизм заключается только в этом: присваивание, передача параметром(при выходе из подпрограммы _release) - вызов _addref присваивание nil, выход за ов - _release т.е. не компилятор вызывает деструктор и следит за счётчиком, а в этих методах это реализовано(повторюсь, стандартная реализация, вы можете написать любую другую) если подсчёт ссылок не реализован - > объект не будет удалён автоматически -> можно использовать разные ссылки если реализован и вы пользуетесь объектной ссылкой при наличии интерфейсной - вы ходите по полю с граблями(надеюсь не надо пояснять почему?) Цитата Qraizer @ Но это ещё мелочи. Что говорят архитекторы самой COM не интересно почитать? читал а ты? и понял? или нужны пояснения? |
![]() |
Сообщ.
#3657
,
|
|
Цитата Shaggy @ для чистоты эксперимента замени writeln на OutputDebugString и смотри окно Event Log Заменил, посмотрел. Что с указателем, что без, поведение одинаковое. |
![]() |
Сообщ.
#3658
,
|
|
Цитата korvin @ Здрасте, приехали. Вот так сюрприз. Значит зря в той же SICP рассказывается об абстракциях? Значит зря мы используем объектно-ориентированный, обобщенный и другие подходы к программированию? Да и вообще зря программируем, ведь это ничто иное как абстрагирование деталей реального мира в компьютерную модель. ну всё, тушите свет ![]() ты подтвердил высказывание пишу конкретно( ![]() Цитата korvin @ Майкрософт? И? Имелось в виду: какой язык? |
![]() |
Сообщ.
#3659
,
|
|
Цитата Shaggy @ фреймворк был аналогом интерфейсной ссылки, а действие в обход аналог объектной Аналогии такие аналогии. Тогда тоже пишу конкретно: ни в одном нормальном фреймворке действие в обход него не приводит ни к каким граблям. А кривые фреймворки так и называют кривыми без выдавания граблей за фичи. Цитата Shaggy @ какой язык? C++? Еще раз: и? Как COM-интерфейсы связаны с ЯП-интерфейсами, которые существовали еще до COM, и в том же C++ ими назывались классы, имеющие только абстрактные методы (т.к. отдельное ключевое слово вводить не стали)? |
![]() |
Сообщ.
#3660
,
|
|
Цитата korvin @ тут непонятного? Ссылка на объект в тех же плюсах, хоть сырая (сырой указатель), хоть умная --- это отдельный от основного объект. так и у нас также объект может узнать количество сслылок(если реализован подсчёт) и всё Цитата korvin @ Ты не наследуешься от shared_ptr или любого другого *_ptr, а строишь свою иерархию как тебе удобно, хоть с интерфейсами, хоть без. А уже потом, когда дело доходит до создания, управления временем жизни объекта и использования, ты сам выбираешь где и как тебе поступить. Явным образом. если ты про объекты, то интерфейс может быть реализован на любом уровне иерархии привязки к TInterfacedObject нет(это просто готовая заготовка) или ты про обязательную реализацию IInterface? |