![]() |
|
Модераторы: 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. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |