Титульная страница   Пространства имен   Алфавитный указатель   Классы   Файлы   Члены пространства имен   Члены классов   Члены файла  

Шаблон класса sh_ptr< T >

Данный класс является разделяемым "умным указателем" с подсчетом ссылок на объект типа T. Подробнее...

#include <sh_ptr.hpp>

Полный список членов класса

Открытые члены

 sh_ptr (T *ptr=0)
 Создает объект, ответственный за уничтожение переданного указателя.

 sh_ptr (const sh_ptr &shp)
 Копирует переданный объект просто увеличивая количество ссылок на разделяемый указатель.

 ~sh_ptr ()
 Уменьшает количество ссылок на разделяемый указатель и удаляет его, если на него никто больше не ссылается.

sh_ptr & operator= (const sh_ptr &shp)
 Присваивает новое значение.

void swap (sh_ptr &shp)
 Обменивает содержимое объектов.

T & operator * () const
 Возвращает ссылку на разделяемый объект при применении к sh_ptr оператора разыменования.

T * operator-> () const
 Возвращает указатель на разделяемый объект при применении к sh_ptr оператора ->.

T * get () const
 Возвращает значение разделяемого указателя.

void set (T *ptr)
 Устанавливает значение разделяемого указателя, т.е.

size_t refs () const
 Возвращает количество ссылок.


Закрытые данные

Reprep
 указатель на разделяемое представление.


Подробное описание

template<class T>
class sh_ptr< T >

Данный класс является разделяемым "умным указателем" с подсчетом ссылок на объект типа T.

В его задачу входит автоматическое уничтожение переданного объекта, когда на него не останется больше ссылок. Если необходимо "забрать" владение переданным указателем у всех копий sh_ptr, то нужно воспользоваться вызовом set(0), в результате чего деструктор sh_ptr ничего не уничтожит, т.к. delete 0 является пустой операцией.

См. определение в файле sh_ptr.hpp строка 29


Конструктор(ы)

template<class T>
sh_ptr< T >::sh_ptr T *  ptr = 0  )  [inline, explicit]
 

Создает объект, ответственный за уничтожение переданного указателя.

Указатель будет корректно удален даже в случае возникновения исключения в конструкторе sh_ptr, т.о. вызов sh_ptr<T>(new T) не приведет к утечке ресурсов. Тем не менее, не стоит забывать, что вызов вроде f(sh_ptr<T1>(new T1), sh_ptr<T2>(new T2)) уже чреват потерей объектов, т.к. порядок вычисления подвыражений не определен и новые объекты T1 и T2 могут быть созданы до соответствующих sh_ptr, отвечающих за освобождение ресурсов.

См. определение в файле sh_ptr.hpp строка 70

00071       {
00072        try { rep=new Rep(ptr); }
00073        catch (...) {
00074              delete ptr;
00075              throw;
00076        }
00077       }

template<class T>
sh_ptr< T >::sh_ptr const sh_ptr< T > &  shp  )  [inline]
 

Копирует переданный объект просто увеличивая количество ссылок на разделяемый указатель.

См. определение в файле sh_ptr.hpp строка 83

Перекрестные ссылки sh_ptr< T >::Rep::refs и sh_ptr< T >::rep.

00084       {
00085        rep=shp.rep;
00086        rep->refs++;
00087       }

template<class T>
sh_ptr< T >::~sh_ptr  )  [inline]
 

Уменьшает количество ссылок на разделяемый указатель и удаляет его, если на него никто больше не ссылается.

См. определение в файле sh_ptr.hpp строка 93

Перекрестные ссылки sh_ptr< T >::Rep::refs.

00093 { if (--rep->refs==0) delete rep; }


Методы

template<class T>
T* sh_ptr< T >::get  )  const [inline]
 

Возвращает значение разделяемого указателя.

См. определение в файле sh_ptr.hpp строка 134

Перекрестные ссылки sh_ptr< T >::Rep::ptr.

00134 { return rep->ptr; }

template<class T>
T& sh_ptr< T >::operator *  )  const [inline]
 

Возвращает ссылку на разделяемый объект при применении к sh_ptr оператора разыменования.

См. определение в файле sh_ptr.hpp строка 123

Перекрестные ссылки sh_ptr< T >::Rep::ptr.

00123 { return *rep->ptr; }

template<class T>
T* sh_ptr< T >::operator->  )  const [inline]
 

Возвращает указатель на разделяемый объект при применении к sh_ptr оператора ->.

См. определение в файле sh_ptr.hpp строка 129

Перекрестные ссылки sh_ptr< T >::Rep::ptr.

00129 { return rep->ptr; }

template<class T>
sh_ptr& sh_ptr< T >::operator= const sh_ptr< T > &  shp  )  [inline]
 

Присваивает новое значение.

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

См. определение в файле sh_ptr.hpp строка 100

Перекрестные ссылки sh_ptr< T >::Rep::refs и sh_ptr< T >::rep.

00101       {
00102        shp.rep->refs++;
00103        if (--rep->refs==0) delete rep;
00104        rep=shp.rep;
00105        
00106        return *this;
00107       }

template<class T>
size_t sh_ptr< T >::refs  )  const [inline]
 

Возвращает количество ссылок.

См. определение в файле sh_ptr.hpp строка 145

Перекрестные ссылки sh_ptr< T >::Rep::refs.

00145 { return rep->refs; }

template<class T>
void sh_ptr< T >::set T *  ptr  )  [inline]
 

Устанавливает значение разделяемого указателя, т.е.

все копии текущего sh_ptr станут указывать на новый объект.

См. определение в файле sh_ptr.hpp строка 140

Перекрестные ссылки sh_ptr< T >::Rep::ptr.

00140 { rep->ptr=ptr; }

template<class T>
void sh_ptr< T >::swap sh_ptr< T > &  shp  )  [inline]
 

Обменивает содержимое объектов.

См. определение в файле sh_ptr.hpp строка 112

Перекрестные ссылки sh_ptr< T >::rep.

00113       {
00114        Rep* tmp=rep;
00115        rep=shp.rep;
00116        shp.rep=tmp;
00117       }


Данные класса

template<class T>
Rep* sh_ptr< T >::rep [private]
 

указатель на разделяемое представление.

См. определение в файле sh_ptr.hpp строка 57

Используется в sh_ptr< T >::operator=(), sh_ptr< T >::sh_ptr() и sh_ptr< T >::swap().


Объявления и описания членов класса находятся в файле:
Документация по xcppcomm. Последние изменения: Sat Mar 20 18:21:53 2004. Создано системой doxygen1.3