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

Ссылки


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







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

Простой указатель образов

На нескольких ближайших страницах показано простейшее решение этой проблемы. А пока лишь скажу, что мы имеем дело с ведущим указателем, удаляющим объекты, на которые он ссылается.

template <class Type>

class ImagePtr {

private:

Type* current; // Текущий образ, предоставляемый компоненту

Type* undo; // Предыдущий образ

public:

ImagePtr() : undo(NULL), current(new Type) {}

ImagePtr(const ImagePtr<Type>& ip)

: current(new Type(*(ip.current))), undo(NULL) {}

~ImagePtr() { delete current; delete undo; }

ImagePtr<Type>& operator=(const ImagePtr<Type>& ip)

{

if (this != &ip) {

delete current;

current = new Type(*(ip.current));

}

return *this;

}

void Snapshot()

{

delete undo; // На случай, если был старый образ

undo = current;

current = new Type(*undo);

}

void Commit()

{

delete undo;

undo = NULL;

}

void Rollback()

{

if (undo != NULL) {

delete current;

current = undo;

undo = NULL;

}

}

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

};

Указатель всегда возвращает «текущий» образ как значение оператора ->, однако за кулисами он прячет предыдущую версию указываемого объекта. Функция Shapshot() создает образ с помощью конструктора копий указываемого объекта. Если клиент передумает и захочет отказаться от изменений, он вызывает функцию Rollback(); если изменения его устраивают, он вызывает функцию Commit().

Конструктор копий и оператор = поддерживают семантику ведущих указателей, но не создают снимков во время конструирования или сразу же после присваивания. Помните: нас интересует состояние указываемого объекта, а не указателя. Когда мы создаем новую копию объекта для поддержания семантики ведущего указателя, для этой копии еще не существует предыдущих образов, которые необходимо отслеживать.

Деструктор предполагает, что если клиент не вызвал функцию Commit(), что-то было сделано

неверно, и уничтожает копию. Специалисты по базам данных - отъявленные пессимисты; если происходит что-то непредвиденное, они всегда предполагают самое худшее. Во многих приложениях при уничтожении указателя вместо Rollback() следовало бы просто вызвать Commit(), предполагая, что до настоящего момента все происходило вполне разумно.


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

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

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