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 килобайт ) Кол-во скачиваний: 425
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 15.4.2015, 14:58
Сообщение #2


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

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

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




Репутация:   8  


Цитата
а чем лучше?

Separation of concerns, разделяете тип хранения (shared_ptr), реестры и ваш класс. Тип хранения это деталь реализации.
Вот например сейчас у вас один реестр, а захотите например 2, из которых один записывает в БД. Добавляете новую фабрику, с 2 реестрами и все. Хотите создаете с одним реестром, хотите с двумя. А если у вас занесение в реестр в конструкторе как вы это реализуете? параметр передавать в конструктор? if-then-else?
Цитата
а если я хочу указатель на созданный тип, а не на базовый?

Interface segregation principle, значит у базового типа плохой интерфейс, возможно стоит сделать еще один? :lol:
Если не хочется много писать, сделайте factory template:
template <typename T>
class MySharedFactory {
  std::shared_ptr<T> create() { return std::shared_ptr<T>(new T); }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexy
  опции профиля:
сообщение 15.4.2015, 15:48
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(lanz @ 15.4.2015, 15:58) *
Separation of concerns, разделяете тип хранения
...
Interface segregation principle, значит у базового типа плохой интерфейс, возможно стоит сделать еще один? :lol:


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

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

ЗЫ: да, мои гуглинья наводят меня на мысль, что это действительно никому не нужно и люди юзают другие способы. выходит что обычно такое рашется именно фабрикой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Текстовая версия Сейчас: 20.7.2025, 0:56