|
Образы указателей У шаблона 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=(). Указателей расплодилось слишком много, и терминология начинает запутываться. Термин «указатель образов» обозначает указатель, в котором содержится несколько образов объекта (и который почти всегда является ведущим), тогда как термин «образы указателей» относится к классу наподобие показанного выше, в котором хранится несколько предыдущих значений самого указателя. |
Copyright 2005. Климов Александр. All Right Reserved.