![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
зачастую приходится создавать такие объекты. Например функторы, которые владеют контейнером
но возникает проблемма с ссылками также как и с указателями при копировании объекта и тому подобное. Если нельзя запретить копирование (например при использовании объектов в контейнерах) то вроде можно там хранить умные указатели на объект. А помогут ли умные указатели в самом объекте
только у передаваемых объектов нужно будет брать адреса
безопасно ли это ? Добавлено Добавлено @ 13:24 ведь this для Some это не boost::shared_ptr а чистый указатель |
||||||
|
|||||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
а конструктор копий чем не подходит?
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
не совсем понял ?
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
а если так
на какой объект ссылается S из Some2 после копирования ? Тоесть нужно ли закрывать от копирования вообще объект ? |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
1. Ты что-то напутал с модификаторами доступа (твой код не скомпилится).
2. Ссылаться будет на тот же, что и первый (по стуи на сам первый). Только здесь можно обойтись обычными указателями. |
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
почему напутал ? компилируется вроде
тоесть нужно закрывать от копирования ? Как же тогда быть с функторами ? |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
У тебя для Some нет паблик-конструктора, а протектед. Не должно компилиться. Или я туплю где-то? |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Объясни конкретно, что ты хочешь. И зачем юзаешь weak_ptr? Либо shared_ptr, либо обычные указатели и хороший контроль, когда что удалять. С weak_ptr в данном случае ты получишь только небезопасный код.
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
почему ? ведь weak_ptr только хранит указатель и не увеличивает число ссылок на объект. Для чего он тогда вообще нужен ? просто если у меня объекты храняться как shared_ptr и я хочу передавать их в другие объекты без увелмчения числа ссылок, то weak_ptr здесь как раз подойдет. Тоесть имея weak_ptr я смогу получить исключение, если объект умер. Если же передавать сам shared_ptr, то при уничтожении объекта извне он в самом деле не умрет. И объект получивший его спокойно будет к нему обращаться, что в моем случае некорректно. Или я неправ ? |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
???
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Все зависит от контекста. Если функтор локальный и коротко-живущий (создали, использовали в алгоритме и сразу отпустили), то туда можно передавать простой указатель (можно и weak_ptr, без разницы).
Если же функтор выходит из контекста, где его создали и живет неопределенное время... то это не функтор... (шутка). Бывает, конечно, и такое. Тогда для безопасности нужно хранить shared_ptr. Если объект должен по твоей логике помереть раньше функтора, то что в этом случае должен делать функтор? Сначала с этим определись. Либо функтор должен нормально отработать (и тогда пусть себе объект проживет немного дольше), либо кто-то одновременно с объектом должен прибить функтор... Но вообще, как я уже сказала - это не совсем функтор получится, а нечто более сложное... -------------------- ... |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Earnest, ну функтор это просто неудачный пример
когда у Child ссылка на Owner не может жыть дольше чем сам Owner. Я чесно говоря просто не понял почему все взъелись на weak_ptr. Или я просто неправильного его использую ? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Я, собственно, сама толком не понимаю, зачем нужен weak_ptr, разве что для полноты картины. Сама в таких случаях использую обчные указатели или ссылки. Но вообще циклических зависимостей лучше избегать, т.е. связь должна быть в одну сторону, по возможности, конечно.
Если зависимый объект не является частью владельца или выпускается им наружу, т.е. не может быть гарантированно и безопасно прибит со смертью владельца - это не взаимоотношения Owner - Child. Тут нужно разруливать дополнительно, в зависимости от ситуации. Но наиболее безопасная схема - указатель с подсчетом ссылок. Если в такой ситуации возникает опасность взаимоблокировок, а объекты равнозначны, т.е. нельзя с уверенностью сказать, кто гарантированно проживет дольше, то можно, скажем, сделать доступ через некоторые "дескрипторы": объекты храняться в неком закрытом хранилище, доступ к ним идет через дескрипторы, и можно в результате получить 0, если объект уже уничтожен. Это например. -------------------- ... |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
В классическй такой связки родители перед смертью говорят всем детям своё последнее слово - забудьте обо мне. Тож делают дети. Не забываем занялть указатели, чтобы рекурсия не пошла. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |