|
Программирование >> Формирование пользовательского контейнера
II Если этот GCPtr указывает на размещенный динамически массив, arraySize содержит размер массива, unsigned arraySize; размер массива static bool first; Равен true, когда создается первый GCPtr. Возвращает iterator для указателя info в списке gclist. typename list<GCInfo<T> >::iterator findPtrInfo(T *ptr); public: Определяет тип итератора для GCPtr<T>. typedef Iter<T> GCiterator; Конструктор для инициализированных и неинициализированных объектов. GCPtr(Т *t=NULL) { Регистрирует shutdovmO как функцию завершения, if(first) atexit(shutdown); first = false; list<GCInfo<T> >::iterator p; p = findPtrlnfo(t); Если t уже есть в списке gclist, увеличивает его счетчик ссылок. В противном случае добавляет его в список. if(p != gclist.endO ) p->refcovint++; увеличение счетчика ссылок else ( Создает и запоминает новый элемент. GCInfo<T> gcObj(t. size); gclist.push front(gcObj); addr = t; arraySize = size; if(size > 0) isArray = true; else isArray = false; #ifdef DISPLAY cout Constructing GCPtr. ; if(isArray) cout Size is arraySize endl; else cout endl; #endif Копирующий конструктор. GCPtr(const GCPtr &ob) { list<GCInfo<T> >::iterator p; p = findPtrlnfo(ob.addr); p->refcovint++; увеличивает счетчик ссылок на единицу addr = Ob.addr; arraySize - ob.arraySize; if(arraySize > 0) isArray = true; else isArray = false; #ifdef DISPLAY cout Constructing copy. ; if(isArray) cout Size is arraySize endl; else cout endl; #endif Деструктор для GCPTr. -GCPtrO; Собирает ьсор. Возвращает true, если хотя бы один объект был удален, static bool collect О; Перегружает присваивание указателя GCPtr. Т *pperator=(T *t); II Перегружает присваивание одного GCPtr другому GCPtr. GCPtr &operator=(GCPtr &rv); Возвращает ссылку на объект, на который указывает этот GCPtr. Т &operator*() { return *addr; Возвращает адрес, на который указывает. Т *operator->() { return addr;} Возвращает ссылку на объект lie индексом, заданным i. Т &operator[](int i) { return addr[i]; Функция преобразования для Т *. operator Т *() { return addr; } Возвращает Iter для начала выделенной памяти. Iter<T> beginO { int size; if(isArray) size = arraySize; else size = 1; return Iter<T>(addr, addr, addr + size); Возвращает Iter для элемента, следукщего за последним элементом распределенного в памяти массива. lter<T> endО { int size; if(isArray) size = arraySize; else size = 1;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |