crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

alexy
  опции профиля:
сообщение 15.4.2015, 0:02
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


shared_ptr нельзя создать в конструкторе...
у меня сейчас в многопоточном коде часто появляются двухэтапные конструкторы. снчала создаешь shared_ptr потом вызываешь какой-нибудь registr или еще что-нибудь, куча отложенных созданий объектов, когда я бы мог создать его в конструкторе ,но создаю в фукнции ,которой он нужен, из-за этого появляются дополнительные проверки "не создал ли я его уже?", которых можно было бы избежать, если бы...
к тому же мне не нравится shared_from_this с точки зрения ООП, это как бы деталь реализации, закравшаяся в интерфейс.

может спасти intrusive_ptr, но у него нет weak_ptr и значит проблема циклических ссылок будет.

вобщем сегодня я накатал такой код. не уверен в правильности использвания std::atomic. выбрал shared_ptr для быстроты реализации. потом хочу сделать структуру, одно поле будет счетчиком ссылок для объекта, другое для weak_ptr'а.

выкладываю: может кому интересно или у кого-то уже есть свои проверенные наработки, лучше чем у меня, поделитесь пожалуйста.

зы: а что, нельзя загружать файлы hpp ??
Прикрепленные файлы
Прикрепленный файл  intrusive_weak_ptr.hpp.txt ( 3.67 килобайт ) Кол-во скачиваний: 422
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 16.4.2015, 9:33
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
может, я не совсем понимаю идею, но чем не устраивает make_shared, например?

После создания хочется выполнять еще какие-то обязательные действия, не только завернуть указатель.

Цитата
иначе, если этого не сделать, то выходит, что сессия будет какое-то время с незалогиненым пользователем.

Это как раз не страшно. Введите состояния сессии и отслеживайте их.
Просто если логинится в конструкторе, то как обрабатывать ошибки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexy
  опции профиля:
сообщение 16.4.2015, 13:44
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 16.4.2015, 10:33) *
Просто если логинится в конструкторе, то как обрабатывать ошибки?

ну, я ввел понятие токена. сессия без логина, не принимает никаких параметоров, сессия с логином, принимает строку токена, ну и не создается (throw login_error) если токен не верен.

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

я просто делаю клиента html, сделал виджетами. один может содержать другой, но есть root - это как бы <html></html> и у него несколько виджетов - <head> <body> и пара других. изначально сделал widget_ptr, и метод parent возращает widget_ptr, но оказалось, что так не получится если я хочу создать в конструкторе виджеты, то есть если он составной.
мне кажется как-то не правильно создавать в фабричном методе внутренние детали виджета.

Цитата(Iron Bug @ 16.4.2015, 14:20) *
один фиг непонятно, чего хотели получить в итоге. а можно пример использования класса и что конкретно не получается?
можно создавать shared_ptr и использовать инициализацию в конструкторе, при этом можно в конструктор передавать shared_ptr'ы на другие объекты. можно через enable_shared_from_this создавать weak_ptr на себя и потом возвращать shared_ptr, полученный из this, через какой-то метод.

да, я об этом писал в первом посте. мне не нравится shared_from_this() то есть если он public, то выходит что это реализация в интерфейсе. я делаю его protected. но в конструкторе все равно не получается. то есть получится, если сделать какой-нибудь метод, get_shared, тогда выйдет
auto sptr_ = new foo();
std::shared_ptr<foo> sptr = sptr_->get_shared();

а сам get_shared, после первого использования должен сделать shared_to_this.release(); или что-нибудь в этом духе, чтобы остался только weak_to_this...

по мне лучше что-нибудь в таком духе (в конструкторе)
// в заголовочном файле
// typedef boost::intrusive_ptr<widget_base> widget_ptr;

root_widget::root_widget() 
    : root_html_(new with_contenet()), body_(new with_content()), head_(new with_content())
{
    *root_html_ << *head_ << *body_;
    // shared_ptr здесь не передать
    //root_html _.parent(/*shared_from_*/this);

    // только пока с этим тоже облом - все равно будет вызванно intrusive_ptr_release
    // это баг в intrusive_ptr?
    boost::intrusive_ptr<widget_base> this_ptr (this, false);

    root_html_->parent(this_ptr); // здесь он преобразуется в weak_ptr
}

// в другом файле, где определяется with_content
widget_ptr with_content::parent() const
{
    return parent_.lock();
}


Сообщение отредактировал alexy - 16.4.2015, 13:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- alexy   weak_ptr from intrusive   15.4.2015, 0:02
- - lanz   Цитатаshared_ptr нельзя создать в конструкторе... ...   15.4.2015, 0:53
- - alexy   Цитата(lanz @ 15.4.2015, 1:53) Или чтобы ...   15.4.2015, 14:19
- - lanz   Цитатаа чем лучше? Separation of concerns, разделя...   15.4.2015, 14:58
|- - alexy   Цитата(lanz @ 15.4.2015, 15:58) Separatio...   15.4.2015, 15:48
- - lanz   Цитатаеще проблема с параметрами для инициализации...   15.4.2015, 16:11
- - Iron Bug   может, я не совсем понимаю идею, но чем не устраив...   16.4.2015, 9:17
- - lanz   Цитатаможет, я не совсем понимаю идею, но чем не у...   16.4.2015, 9:33
|- - alexy   Цитата(lanz @ 16.4.2015, 10:33) Просто ес...   16.4.2015, 13:44
- - Iron Bug   один фиг непонятно, чего хотели получить в итоге. ...   16.4.2015, 13:20
- - lanz   shared_ptr подразумевает некую семантику - когда s...   16.4.2015, 14:25
- - Iron Bug   а зачем делать auto sptr_ = new foo(); st...   16.4.2015, 14:29
|- - alexy   Цитата(Iron Bug @ 16.4.2015, 15:29) если ...   16.4.2015, 15:04
- - lanz   1. При такой архитектуре вы можете удалить виджет ...   16.4.2015, 15:15
|- - alexy   Цитата(lanz @ 16.4.2015, 16:15) 1. При та...   16.4.2015, 15:46
- - lanz   Цитата1. ну да.. а что в этом такого? Ничего, если...   16.4.2015, 18:17
- - Iron Bug   обычная схема перерисовки данных - это чтение данн...   17.4.2015, 11:24


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 3.7.2025, 18:05