Материалы книги получены с 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=().
Указателей расплодилось слишком много, и терминология начинает запутываться. Термин «указатель образов» обозначает указатель, в котором содержится несколько образов объекта (и который почти всегда является ведущим), тогда как термин «образы указателей» относится к классу наподобие показанного выше, в котором хранится несколько предыдущих значений самого указателя.
Назад Содержание Далее
|