Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объект-владелец 
:(
    Опции темы
zss
Дата 12.1.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



зачастую приходится создавать такие объекты. Например функторы, которые владеют контейнером
Код
template <class T>
class S
{
    T& m_t;
    S (const T& t) : m_t(t){;}
}


но возникает проблемма с ссылками также как и с указателями при копировании объекта и тому подобное.
Если нельзя запретить копирование (например при использовании объектов в контейнерах) то вроде
можно там хранить умные указатели на объект.

А помогут ли умные указатели в самом объекте
Код
class S
{
    boost::weak_ptr<T> m_t;
    S (const boost::weak_ptr<T>& t) : m_t(t){;}
}


только у передаваемых объектов нужно будет брать адреса
Код
class Some
{
    void f(void)
   {
        S <Some>(boost::shared_ptr<Some>(this));
   }
}


безопасно ли это ? 

Добавлено Добавлено @ 13:24
ведь this для Some это не boost::shared_ptr а чистый указатель
PM MAIL ICQ   Вверх
bel_nikita
Дата 12.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



а конструктор копий чем не подходит?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
zss
Дата 12.1.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



не совсем понял ?
PM MAIL ICQ   Вверх
Daevaorn
Дата 12.1.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(zss @  12.1.2007,  15:28 Найти цитируемый пост)
безопасно ли это ? 

нет. это UB
Цитата(zss @  12.1.2007,  15:28 Найти цитируемый пост)
boost::weak_ptr<T> m_t;

boost::weak_ptr немного не для этого. 
В твоём случае, при грамотном дизайне, подойдут и голые указатели
PM MAIL WWW   Вверх
zss
Дата 13.1.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



а если так
Код

class Some;
class S
{
    boost::weak_ptr<Some> m_some;
    explicit S (const boost::shared_prt<Some>& some) : m_some (some) {;}
}

class Some : protected boost::enable_shared_from_this <Some>
{
    Some () : s(shared_from_this())
    S s;
}

int main (...)
{
    Some some1;
    Some some2 = some1;

    some2.s;
}



на какой объект ссылается S из Some2 после копирования ?

Тоесть нужно ли закрывать от копирования вообще объект ?
PM MAIL ICQ   Вверх
Любитель
Дата 14.1.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



1. Ты что-то напутал с модификаторами доступа (твой код не скомпилится).

2. Ссылаться будет на тот же, что и первый (по стуи на сам первый). Только здесь можно обойтись обычными указателями.


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 14.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Любитель @  14.1.2007,  15:46 Найти цитируемый пост)
1. Ты что-то напутал с модификаторами доступа (твой код не скомпилится).

почему напутал ? компилируется вроде smile


Цитата(Любитель @  14.1.2007,  15:46 Найти цитируемый пост)
2. Ссылаться будет на тот же, что и первый (по стуи на сам первый). Только здесь можно обойтись обычными указателями

тоесть нужно закрывать от копирования ?
Как же тогда быть с функторами ?
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(zss @  14.1.2007,  17:43 Найти цитируемый пост)
Как же тогда быть с функторами ? 

а какая в принципе связь между идиомой функторов и объектов владельцев?
PM MAIL WWW   Вверх
Любитель
Дата 14.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(zss @  14.1.2007,  16:43 Найти цитируемый пост)
почему напутал ? компилируется вроде 

У тебя для Some нет паблик-конструктора, а протектед. Не должно компилиться. Или я туплю где-то?


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 14.1.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Любитель @  14.1.2007,  16:56 Найти цитируемый пост)
У тебя для Some нет паблик-конструктора, а протектед. Не должно компилиться. Или я туплю где-то?

ну код писал прям здесь - естественно он открыт.
Вопрос не в этом, а как быть с ссылками ?
PM MAIL ICQ   Вверх
Любитель
Дата 18.1.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Объясни конкретно, что ты хочешь. И зачем юзаешь weak_ptr? Либо shared_ptr, либо обычные указатели и хороший контроль, когда что удалять. С weak_ptr в данном случае ты получишь только небезопасный код.


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 18.1.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(Любитель @  18.1.2007,  16:17 Найти цитируемый пост)
Объясни конкретно, что ты хочешь. И зачем юзаешь weak_ptr? Либо shared_ptr, либо обычные указатели и хороший контроль, когда что удалять. С weak_ptr в данном случае ты получишь только небезопасный код. 

почему ? ведь weak_ptr только хранит указатель и не увеличивает число ссылок на объект.
Для чего он тогда вообще нужен ? просто если у меня объекты храняться как shared_ptr
и я хочу передавать их в другие объекты без увелмчения числа ссылок, то weak_ptr здесь как
раз подойдет. Тоесть имея weak_ptr я смогу получить исключение, если объект умер.

Если же передавать сам shared_ptr, то при уничтожении объекта извне он в самом деле не умрет.
И объект получивший его спокойно будет к нему обращаться, что в моем случае некорректно.

Или я неправ ?
PM MAIL ICQ   Вверх
zss
Дата 21.1.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



???
PM MAIL ICQ   Вверх
Earnest
Дата 22.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Все зависит от контекста. Если функтор локальный и коротко-живущий (создали, использовали в алгоритме и сразу отпустили), то туда можно передавать простой указатель (можно и weak_ptr, без разницы).
Если же функтор выходит из контекста, где его создали и живет неопределенное время... то это не функтор... (шутка). Бывает, конечно, и такое. Тогда для безопасности нужно хранить shared_ptr. Если объект должен по твоей логике помереть раньше функтора, то что в этом случае должен делать функтор? Сначала с этим определись. Либо функтор должен нормально отработать (и тогда пусть себе объект проживет немного дольше), либо кто-то одновременно с объектом должен прибить функтор...
Но вообще, как я уже сказала - это не совсем функтор получится, а нечто более сложное...




--------------------
...
PM   Вверх
zss
Дата 22.1.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Earnest, ну функтор это просто неудачный пример smile а вообще конечно это связка Owner-Child
когда у Child ссылка на Owner не может жыть дольше чем сам Owner.

Я чесно говоря просто не понял почему все взъелись на weak_ptr. Или я просто неправильного его использую ?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.