![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sol78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
как правильно написать свой Smart Pointer (не универсальный) а скажем, для своего класса String??
- что иммено в нем должно бить? вот я тут набрасала: .h
.cpp
-т.ж. функция update(..) не работает, д/б реализован pattern copy on write (я так думаю..) -С удовольствием приму все замечания и предложения!!! |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Огласи-ка сначала задачи, которые этот смарт-поинтер должен выполнять. Я лично вот не понял.
|
|||
|
||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
1 считает ссылки
2 не дублирует обьекты, т.е. если есть стринг "вася" , другого быть не должно, просто увеличеваем счетчик.. 3 реализует COW 4 удаление - гарбич коллектор остальное и является вопросом...т.е. как его рассширить, чтобы класс Стринг стал оочень простим? Это сообщение отредактировал(а) sol78 - 27.1.2008, 22:32 |
|||
|
||||
| Fazil6 |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
у меня закралось сильное сомнение, что мы по разному понимаем термин "smart pointer". Впервую очередь предполагается, что смартпоинтер используется по значению и имеет перегруженный конструктор копии и оператор присваивания. У тебя же какая-то замороченная обертка над массивом символов скорее смахивающая на попытку реализации строкового класса и честно говоря в логику его я не втыркнул особо. Добавлено через 5 минут и 8 секунд чем больше смотрю на эту реализацию, тем менее понимаю идеи. Вижу интерфейс
слабо себе представляю зачем такие функции у смартпоинтера и как я бы им пользовался. |
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Fazil6, вот у меня такие же мысли.
sol78, давай пример использования этой штуки в студию. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
А я слабо себе представляю как можно пользоваться смарт поинтером не реализующим операторы -> и * смарт поинтер должен иметь ту-же семантику что и указатель Добавлено через 1 минуту и 45 секунд Джеф Элджер - "Библиотека программиса" - почти вся книга про смарт поинтеры |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
может, всё-таки одна треть? |
|||
|
||||
| sol78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
Я согласна, что интерфейс не годиться.... поэтому возник данный вопрос. - как правильно написать свой Smart Pointer (не универсальный) а скажем, для своего класса String?? О примере использования могу только сказать что
|
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Идиома COW хорошо описана в книге - С. Мейерс "Наиболее эффективное использование С++". Там в конце книги есть примеры программирования, один из них, это как раз реализация COW на примере строк.
|
|||
|
||||
| Ulysses4j |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Умные укзатели это классы, объекты которых обычно используются по значению, так что вам нужно ориентироваться на интерфейс вроде
Конструктора по умолчанию быть не должно: другая отличительная черта умных указателей это использование идиомы RAII - Resource Acquisition Is Initialization (захват ресурса на стадии инициализации). Поясню. Умные указатели предназначены для автоматизации управления ресурсами, которые требуют ручной инициализации и зачистки, примером в вашем случае может служить символьная строка в динамической памяти (куче) — память нужно выделять new, а зачищать - delete. RAII означает, что захват управляемых ресурсов должен происходить при инициализации объекта класса умного указателя, то есть примерно так:
Клиентскому коду, использующему ваш умный укзатель, достаточно вызвать только конструктор, как показано выше, delete же будет вызван в деструкторе SmartPt, незаметно для клиента.
Далее необходимо реализовать в вашем классе хотя бы минимальный традиционный интерфейс указателей, как был совершенно справедливо указано выше - operator*() и operator++(). Важным моментом является реализация операций копирования (конструктора копирования и операции копирующего присваивания — SmartPointer(SmartPointer const&) и operator=(SmartPointer const&)). Для начала я советую реализовать самый простой вариант, когда при копировании умных указателей, копируются соответсвующие сегменты памяти. За copy-on-write и подсчет ссылок лучше взяться потом. Это сообщение отредактировал(а) Ulysses4j - 28.1.2008, 15:11 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
||||||||||
|
|||||||||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Да, погорячился, идиоматический вызов с new сбил с толку.
Это сообщение отредактировал(а) Ulysses4j - 28.1.2008, 15:54 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
Спасибо за советы!
Вопрос конкретный : как мне написать конструктор для SmartPointer, который не дублирует обьекты, т.е. если есть уже "вася" нового "вася" быть не должно . И результат его работы : this указывает на существующий smart pointer и counter++;? Добавлено через 1 минуту и 21 секунду да тут без вопросов |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
сделать ставический список, где лежат все значения. При создании нового экземпляра смотреть в этом списке. Тока нужна синхронизация для многопоточности и это не COW. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Вот такой вот велосипед я однажды написал...
отнаследовать от класса reference_counter, а затем работать через класс reference, прикол этого кода в том, что с потомками reference_counter никак иначе, кроме как через смарт поинтер работать нельзя... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Lazin, мне очень даже с виду понравилось. Какая лицензия у этого исходника? Под GPLv3 можно стырить?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
ээээ... ну если в трёх словах, ты объявляешься автором данного кода со всеми вытекающими + разрешаешь всему сообществу изменять код как заблагорассудится при условии сохранения твоих авторских прав а так - на http://www.gnu.org/licenses/gpl-3.0.html всё расписано. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Lazin, смеёшься
|
|||
|
||||
| sol78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
Я просто в тупике
вот один конструктор для SP ни как не продвигается, гляньте плз,
вырезаю все остальное еще не написано
Lazin, спасибо за класс, но использовать его не могу токовы требования |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
это в объявлении класса ставить не нужно увы, телепаты не скажут нам, какой это конструктор и что он должен делать... Это сообщение отредактировал(а) JackYF - 29.1.2008, 17:32 |
|||
|
||||
| sol78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
JackYF, не множечко терпения
в конструкторе: -вызов ф. addSmartPointer(const char* str) -там
с помощью коменариев попробовала обьяаснить... |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
this (как указатель) изнутри самого себя менять нельзя. Создавай новый объект, который уже указывает на нужную строку либо меняй архитектуру. |
|||
|
||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
Проблема видемо в том что я не могу влиять (в необходимой мне степени) на обьект на уровне конструктора,
что остается вернутся с чаго начала? Не ужели етот вариант тупиковый? |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Пробуй другие варианты, которые приходят тебе в голову. Возможно, это создание не одного централизованного списка, а все одинаковые строки хранят отдельные, "свои" списки. |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
На мой взгляд COW - это как-то так:
Набросал небольшой пример, как можно это сделать... я использовал код который приводил выше Здесь конечно все сильно упрощено, но идея должна быть понятна: объекты класса str_buffer содержат непосредственно данные(строки char-ов), объекты класса String - содержат ссылки на объекты str_buffer, при копировании строк, передаче по значению, копирования данных не происходит, копируются только ссылки (класс ссылки - reference) и при изменении количества ссылок на буфер, счетчик ссылок изменяется то-же, при обнулении счетчика ссылок буфер удаляется. При изменении строки, просто выделяется новый буффер, а старый освобождается (его счетчик ссылок уменьшается на 1), если только одна строка использовала этот буфер он удалится.
|
||||
|
|||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: 1 Всего: 0 |
Lazin,
до COW у меня еще руки не дошли... но в принципе идея понятна... Я заткнулась на счетчике ссылок и не дублиравание обьектов.... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |