C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet81/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   77   78   79   80   81   82   83   84   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
139 
копий указываемого объекта. Существует множество всевозможных комбинаций и вариаций, так что 
выбор зависит главным образом от вашего настроения. 
Простой указатель образов 
На нескольких ближайших страницах показано простейшее решение этой проблемы. А пока лишь 
скажу, что мы имеем дело с ведущим указателем, удаляющим объекты, на которые он ссылается. 
template  
class ImagePtr { 
private: 
Type* 
current; 
// 
Текущий образ, предоставляемый компоненту 
Type* 
undo; 
// 
Предыдущий образ 
public: 
ImagePtr() : undo(NULL), current(new Type) {} 
ImagePtr(const 
ImagePtr
ip) 
: current(new Type(*(ip.current))), undo(NULL) {} 
~ImagePtr() { delete current; delete undo; } 
ImagePtr& operator=(const ImagePtr& 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()



 140 
Конструктор копий и оператор 
=
поддерживают семантику ведущих указателей, но не создают снимков 
во время конструирования или сразу же после присваивания. Помните: нас интересует состояние 
указываемого объекта, а не указателя. Когда мы создаем новую копию объекта для поддержания 
семантики ведущего указателя, для этой копии еще не существует предыдущих образов, которые 
необходимо отслеживать. 
Деструктор предполагает, что если клиент не вызвал функцию 
Commit()
, что-то было сделано 
неверно, и уничтожает копию. Специалисты по базам данных — отъявленные пессимисты; если 
происходит что-то непредвиденное, они всегда предполагают самое худшее. Во многих приложениях 
при уничтожении указателя вместо 
Rollback()
следовало бы просто вызвать 
Commit()
, предполагая, 
что до настоящего момента все происходило вполне разумно. 
Стеки образов 
Для многоуровневой отмены вам может понадобиться стек предыдущих образов. Один из вариантов 
реализации — хранить стек в каждом указателе образов. В следующем фрагменте предполагается, что 
у вас имеется параметризованный класс 
Stack
с функциями 
Empty()

Push()

Pop()
и 
DeleteAll()

Функция 
Pop()
возвращает верхний элемент стека или 
NULL
, если стек пуст. Функция 
DeleteAll()
опустошает стек и уничтожает все объекты по мере их извлечения. Каждый указатель хранит стек 
предыдущих образов. Если стек пуст, значит, образы не создавались. Если стек не пуст, в его нижней 
части находится исходный объект. Функция 
Rollback()
находит и восстанавливает этот объект. 
Конструктор копий и оператор 
=
работают так же, как и в описанном выше простейшем указателе 
образов. 
template  
class ImageStackPtr { 
private: 
Type* 
current; 
// 
Текущий образ, предоставляемый клиенту 
Stack 
history; 
// 
Предыдущие образы 
public: 
ImageStackPtr() : current(new Type) {} 
ImageStackPtr(const 
ImageStackPtr
ip) 
: current(new Type(*(ip.current))) {} 
~ImageStackPtr() { delete current; } 
ImageStackPtr& operator=(const ImageStackPtr& ip) 

if (this != &ip) { 
history.DeleteAll(); 
delete 
current; 
current = new Type(*(ip.current)); 

return 
*this; 

void 
PushImage() 

history.Push(current); 
current = new Type(*current); 

void Commit() { history.DeleteAll(); } 
void 
PopImage() 
// 
Вернуться на один уровень 

if (!history.Empty()) { 
delete 
current; 
current 

history.Pop(); 



Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   77   78   79   80   81   82   83   84   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish