RefCount.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 /**
00015  * \defgroup RefCount Cntm.RefCount
00016  * Подсчет ссылок на объекты предназначен для автоматизации управления временем жизни оъектов. Суть управления временем жизни объектов с помощью подсчета ссылок заключается в следующем. Объект обладает таким свойством, как кол-во ссылок на него. После создания объекта кол-во ссылок на него устанавливается в 1, т.к. создатель получает ссылку на объект. Если создатель передает ссылку на созданный объект еще кому-то, то счетчик ссылок объекта следует увеличить на 1. Когда использование объекта завершено, то следует уменьшить кол-во ссылок на 1 и больше не использовать ссылку. Когда счетчик ссылок достигает 0, это означает, что пользователей данного объекта не осталось и он должен запустить процедуру своего уничтожения.
00017  * 
00018  * <H2>Классы, реализующие подсчет ссылок</H2>
00019  * 
00020  * Базовые классы подсчета ссылок
00021  * 
00022  * Для декларации объектов, которые подсчитывают ссылки на себя (такие объекты будем называть ссылочными), библиотека предоставляет интерфейс Cntm::IRefObject. Данный интерфейс определяет правила управления подсчетом ссылок со стороны объекта. Правила подсчета ссылок приведены в описании интерфейса Cntm::IRefObject. Библиотека предоставляет базовые классы, реализующие интерфейс Cntm::IRefObject: Cntm::RefBase для простых случаев и Cntm::RefBaseEx для более сложных. Класс, который должен обеспечивать подсчет ссылок должен наследовать Cntm::RefBase или Cntm::RefBaseEx.
00023  * 
00024  * <H3>Агрегация</H3>
00025  * 
00026  * Сложный объект может содержать встроенные объекты, время жизни которых совпадает с временем жизни сложного объекта, т.е. за создание и уничтожение которых отвечает сложный объект. В этом случае сложный объект называют агрегатом, а встроенные объекты - агрегируемыми объектами. В некоторых случаях требуется использовать ссылки на агрегированные объекты. Т.к. время жизни агрегируемого объекта определяется агрегатом, то при увеличении кол-ва ссылок на агрегируемый объект следует увеличивать ссылки на агрегат. Аналогичная переадресация должна выполняться и при уменьшении кол-ва ссылок. Т.о. агрегат будет существовать, пока есть ссылки на него или на его агрегированные объекты. Данная политика выпоняется классом Cntm::AggregatedBase, который реализует интерфейс Cntm::IRefObject. Если объект предназначен для агрегирования, то его класс должен наследовать Cntm::AggregatedBase. Класс Cntm::AggregatedBaseпросто перенаправляет вызовы методов увеличения и уменьшения ссылок агрегату, который передан ему при создании.
00027  * 
00028  * <H3>Ссылочные указатели</H3>
00029  * 
00030  * Управление увеличением и уменьшением счетчика ссылок со стороны пользователей объекта автоматизировано с помощью ссылочных указателей. Сылочные указатели представлены классом Cntm::RefPtr<T>. Это шаблонный класс, где T - класс, на объекты которого будет указывать ссылочный указатель. При чтении он ведет себя практически как обычный указатель T*, т.е. для него определены операторы ->, *, bool, ! и ==. Но при создании и записи этот класс выполняет действия по изменению кол-ва ссылок. Для данного класса существуют 2 вида конструкторов и операторов присваивания: принимающие указатель на объект - T* и принимающие ссылочный указатель. Конструкторы и операторы присваивания увеличивают кол-во ссылок на присваиваемый объект. Деструктор и операторы присваивания уменьшают кол-во ссылок на текущий объект.
00031  * 
00032  * Если при инстанциации шаблона Cntm::RefPtr<T> тип T не является классом, подсчитывающим ссылки, т.е. не является Cntm::IRefObject или его наследником,то Cntm::RefPtr ведет себя как обычный указатель, т.е. не выполняет ни каких действий по изменению кол-ва ссылок и, соответственно не управляет уничтожением объекта.
00033  * 
00034  * <H3>Обобщенные ссылочные указатели</H3>
00035  * 
00036  * Назначение обобщенных ссылочных указателей такое же, что и у обычных - управление подсчетом ссылок. Однако между ними имеется большое отличие - обобщенные указатели не являются шаблонами, т.е. не зависят от типа объекта, на который указывают. Через обобщенный указатель нельзя использовать для доступа к членам класса, т.к. он хранит указатель на void*. Обобщенный указатель следует использовать тогда, когда требуется управление подсчетом ссылок, не нужно обращаться к членам класса и желательно отказаться от шаблонов. При присвоении не ссылочного объекта (унаследованного не от Cntm::IRefObject) ни каких действий по изменению кол-ва ссылок не выполняется. Подробности в описании класса Cntm::GenericRefPtr.
00037  * 
00038  * В некоторых случаях требуется обеспечить потенциальную возможность управлять подсчетом ссылок. Это реализуется с помощью класса Cntm::GenericNoRefPtr, который не изменяет кол-во ссылок сам по себе, но м.б. присвоен обобщенному ссылочному указателю Cntm::GenericRefPtr.
00039  * 
00040  * Кроме обычных обобщенных указателей имеются обобщенные указатели на методы объектов Cntm::GenericMethodRefPtr и Cntm::GenericMethodNoRefPtr. Они соединяют обобщенные указатели на объект с адресом метода этого объекта. Их поведение полностью аналогично Cntm::GenericRefPtr и Cntm::GenericNoRefPtr соответственно.
00041  */
00042 
00043 #include <Cntm/RefCount/RefPtr.h>
00044 #include <Cntm/RefCount/GenericPtr/GenericRefPtr.h>
00045 #include <Cntm/RefCount/GenericPtr/GenericNoRefPtr.h>
00046 #include <Cntm/RefCount/GenericPtr/GenericMethodRefPtr.h>
00047 #include <Cntm/RefCount/GenericPtr/GenericMethodNoRefPtr.h>
00048 #include <Cntm/RefCount/IRefObject.h>
00049 #include <Cntm/RefCount/RefBase.h>
00050 #include <Cntm/RefCount/RefBaseEx.h>
00051 #include <Cntm/RefCount/AggregatedBase.h>
00052 #include <Cntm/RefCount/RefNone.h>

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3