С++ - язык, который изучается постепенно.Образы указателей
                   Справочники Всё для создания сайта

Ссылки


Home
Бизнес
Справочники
Советы







Материалы книги получены с http://www.itlibitum.ru/

Образы указателей

У шаблона AutoImage есть одно довольно занятное применение - им можно воспользоваться для создания образов *-указателя. В некоторых ситуациях не хочется создавать лишние копии указываемого объекта только чтобы следить за тем, на что ссылался указатель в прошлой жизни.

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

AutoImage<Foo*> f;

Теперь вы можете восстановить состояние указателя f в начале транзакции, в том числе и NULL. Тем не менее, существует веский довод в пользу создания специализированного шаблона для *-указателей - необходимость перегрузки оператора ->, чтобы указатель образов можно было использовать в левой части выражений (что-нибудь типа ptr->MemberOfPointer();). Для *-указателей AutoImage похож на глупые указатели, с которыми мы рассправились в начале главы 5. Следующий шаблон больше напоминает обычные умные (но не ведущие!) указатели.

template <class Type>

class PtrImage {

private:

Type* current;

Type* image;

bool have_image; // Истина, если образ существует

public:

PtrImage() : current(NULL), image(NULL), have_image(false) {}

PtrImage(const PtrImage<Type>& pi)

: current(pi.current), image(NULL), have_image(false) {}

PtrImage<Type>& operator=(const PtrImage<Type>& pi)

{

if (this != &pi)

current = pi.current;

return *this;

}

PtrImage<Type>& operator=(Type* t)

{ current = t; return *this; }

operator Type*() { return current; }

Type* operator->() const { return current; }

bool operator!() { return current == NULL; }

void Snapshot()

{

image = current;

have_image = true;

}

void Commit() { image = NULL; have_image = false; }

void Rollback()

{

if (have_image) {

current = image;

have_image = false;

}

bool HaveImage() { return have_image; }

};

Если вам захочется еще немного автоматизировать этот шаблон, добавьте вызовы Snapshot() в обе операторные функции operator=().

Указателей расплодилось слишком много, и терминология начинает запутываться. Термин «указатель образов» обозначает указатель, в котором содержится несколько образов объекта (и который почти всегда является ведущим), тогда как термин «образы указателей» относится к классу наподобие показанного выше, в котором хранится несколько предыдущих значений самого указателя.


Назад    Содержание    Далее    

Home  Создание сайтов  Учебник по записи CD  Справочник Web дизайнера Самоучитель IE PHP и MySQL Компьютерные сети С++ E-mail me

Copyright 2007. Климов Александр. All Right Reserved.
Hosted by uCoz