Чтение онлайн

на главную - закладки

Жанры

Идиомы и стили С++

Makhmutov Albert

Шрифт:

Понимаете теперь, в чем преимущество смарт-указателей? Они позволяют с легкостью создавать новые уровни бизнес-логик без привлечения дополнительных средств и схем, а едиными только средствами языка. Попробуйте сделать что-либо подобное на языке, который не поддерживает указателей и перегрузки операторов (да шаблоны еще)! Вот код.

#include "ampstack.h"

// Абстрактный базовый класс

class CLockable {

 friend class CTransaction;

protected:

 //
текущая транзакция, если есть

 CTransaction* m_trans;

public:

 CLockable : m_trans (NULL) {}

 // регистрируемся в какой-то транзакции

 int regObj (CTransaction* _pt);

 // и разрегистрируемся

 void unregObj;

 virtual ~CLockable {}

 virtual void rollback =0;

 virtual void commit =0;

};

// Класс транзакции

class CTransaction {

 friend class CLockable;

private:

 // коллекция зарегистрированных объектов

 ampstack‹CLockable› m_locks;

 // добавить объект к транзакции

 void addLock (CLockable*);

public:

 virtual ~CTransaction ;

// закрепить или отменить все изменения во всех

// зарегистрированных объектах.

 void commit;

 void rollback;

// проверить, зарегистрирован ли объект в этой транзакции

 int allready_locked(CLockable*);

};

// зарегистрироваться в транзакции

inline int CLockable::regObj (CTransaction* _pt) {

 if (m_trans!= NULL) return 0;

 else {

_pt-›addLock(this);

m_trans = _pt;

return 1;

 }

}

// разрегистрироваться

inline void CLockable::unregObj {

 m_trans = NULL;

}

//
добавление объекта к транзакции.

inline void CTransaction::addLock(CLockable* _lc) {

 // а именно, воткнуть указатель на него в стек.

 m_locks.push (_lc);

}

// закрепление всех объектов

void CTransaction::commit {

 // создаем итератор

 ampIter‹CLockable› it(&(this-›m_locks));

 // пробежались по всем, закрепились.

 it.goStart;

 while (!it.isLast) it.moveNext-›commit;

 // Всех выкинуть из стека, разрегистрировать.

 while (!m_locks.isEmpty) m_locks.pop-›unregObj;

}

// отмена всех объектов

void CTransaction::rollback {

 // создали итератор

 ampIter‹CLockable› it(&(this-›m_locks));

 // пробежались по всем, отменились.

 it.goStart;

 while (!it.isLast) it.moveNext-›rollback;

 // Всех выкинуть из коллекции и разрегистрировать

 while (!m_locks.isEmpty) m_locks.pop-›unregObj;

}

// проверка, зарегистрирован ли объект.

int CTransaction::allready_locked(CLockable* _lc) {

 // создали итератор

 ampIter‹CLockable› it(&(this-›m_locks));

 it.goStart;

 while (!it.isLast) if (it.moveNext == _lc) return 1;

 return 0;

}

Шаг 29 - Единственный экземпляр класса - Одиночка или Singleton.

Как гарантировать единичность экземпляра некоего класса?

Предположим, что Вы проектируете программную систему, в которой некое устройство должно быть исключительно в одном экземпляре. Какие у нас варианты?

1. Создать класс устройства, объявить его экземпляр в специальном файле globals.cpp, и обязать программистов использовать строго его (именно так я делал на заре карьеры; наш шеф под роспись давал нам "Меморандум о писании программ", там много было интересного).

Поделиться:
Популярные книги

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Очкарик 3

Афанасьев Семён
3. Очкарик
Фантастика:
фэнтези
5.75
рейтинг книги
Очкарик 3

Игра престолов. Битва королей

Мартин Джордж Р.Р.
Песнь Льда и Огня
Фантастика:
фэнтези
боевая фантастика
8.77
рейтинг книги
Игра престолов. Битва королей

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Дикая фиалка заброшенных земель

Рейнер Виктория
1. Попаданки рулят!
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Дикая фиалка заброшенных земель

Санек 4

Седой Василий
4. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Черт из табакерки

Донцова Дарья
1. Виола Тараканова. В мире преступных страстей
Детективы:
иронические детективы
8.37
рейтинг книги
Черт из табакерки

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва