• Пожаловаться

Albert Makhmutov: Идиомы и стили С++

Здесь есть возможность читать онлайн «Albert Makhmutov: Идиомы и стили С++» весь текст электронной книги совершенно бесплатно (целиком полную версию). В некоторых случаях присутствует краткое содержание. категория: Программирование / на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале. Библиотека «Либ Кат» — LibCat.ru создана для любителей полистать хорошую книжку и предлагает широкий выбор жанров:

любовные романы фантастика и фэнтези приключения детективы и триллеры эротика документальные научные юмористические анекдоты о бизнесе проза детские сказки о религиии новинки православные старинные про компьютеры программирование на английском домоводство поэзия

Выбрав категорию по душе Вы сможете найти действительно стоящие книги и насладиться погружением в мир воображения, прочувствовать переживания героев или узнать для себя что-то новое, совершить внутреннее открытие. Подробная информация для ознакомления по текущему запросу представлена ниже:

libcat.ru: книга без обложки

Идиомы и стили С++: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Идиомы и стили С++»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Albert Makhmutov: другие книги автора


Кто написал Идиомы и стили С++? Узнайте фамилию, как зовут автора книги и список всех его произведений по сериям.

Идиомы и стили С++ — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Идиомы и стили С++», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

if (previos != NULL) {

delete that;

that = previos;

previos = NULL;

}

}

// реализация указателя

CSomeClass* operator-›() { return that; }

};

int main (void) {

// проверим быстренько

CSimpleTr lvPair;

lvPair-›x = 5;

lvPair-›y = 8;

lvPair.BeginTrans();

lvPair-›x = 7;

lvPair-›y = 11;

lvPair.Rollback();

lvPair.BeginTrans();

lvPair-›x = 7;

lvPair-›y = 11;

lvPair.Commit();

return 0;

}

Что может быть проще? Семантика значений, очевидно. Классы должны иметь полный набор обязательных функций, как обычно; в нашем случае класс CSomeClassбольно уж тривиален, поэтому сойдет и так. Класс CSimpleTrимеет смысл переписать в виде шаблона, если не хотите его заново переписывать для каждого нового клиента, да еще добавить функцию isStarted(). Функциональность на Ваш вкус и фантазию. MTS, например, восстановит отмененную транзакцию, если Вы после отмены сделаете закрепление: SetAbort(); SetComplete();сработает так, как будто SetAbort();не было вовсе.

Шаг 23 - Классы объектов, поддерживающие транзакции. Продолжение.

Раз уж взялись, что мешает вставить в наш умный указатель с поддержкой отмены не один, а несколько предыдущих состояний объекта? Ничего. Только чтобы потом несколько раз не переделывать, решим несколько чисто технических моментов:

1. Какую структуру будем использовать в качестве коллекции состояний? Можно взять стек, можно кольцевой буфер, а можно и карту (словарь, хэш-таблицу); стек явно проще, зато за кольцевым буфером можно не следить вообще, пусть устаревшие состояния пропадают бесследно (конечно по желанию).

2. Определимся с семантикой. Смешивать значения и указатели не стоит, верный путь заработать себе геморрой. У меня не оказалось под рукой подходящего стека, и я написал для этого Шага два варианта - один хранит значения, другой - указатели; первый стек сначала казался проще, но использующий его класс указателя оказался ощутимо сложнее по простой причине - функции стека с указателями могут возвращать NULL, а это совсем немало.

3. Оформим все в виде шаблонов; вообще контейнеры просто просятся быть шаблонами, а smart-указатели несомненно являются контейнерами.

Код ниже, а сейчас пояснения:

Класс CTypeпросто проверочный, чтобы вкладывать в шаблоны; так проще отлаживать шаблон: сначала сделать контейнер-не-шаблон для класса Type, а потом просто приписать сверху объявления строку template‹Type›. Шаблон класса ampstack‹Type›- шаблон стека указателей; pushсохраняет указатель, popдостает верхний указатель, isEmptyпроверяет на пустоту, emptyAllочищает.

Шаблон класса MLTrans- наконец тот, который нам нужен. Указатель thatхранит текущее значение, Pushсохраняет текущее значение, PopOneделает однократную отмену, Rollbackотменяет все изменения, до первоначального, Commitудаляет историю.

// Это маленький класс для проверки

class CType {

int a;

public:

void set (int _a) { a=_a; }

int get (void) { return a; }

};

// Шаблон стека

template ‹class Type›

class ampstack {

private:

int iTop; // верх стека

int iSize; // размер стека

Type** array; // массив указателей

public:

// Конструктор-деструктор

ampstack(int size=10) : iTop(0), iSize(size), array(new Type*[size]) {}

~ampstack() {

for (int iCounter = 0; iCounter ‹ iTop; iCounter ++)

if (*(array+iCounter)!= NULL) delete *(array+iCounter);

delete[] array;

}

// Управление стеком

// Направить указатель в стек

void push (Type* _t) { array[iTop++]=_t; }

// Вынуть указатель из стека

Type* pop (void) {

if (iTop == 0) return NULL;

else return array[--iTop];

}

// Стек пуст?

int isEmpty (void) { return iTop==0; }

// Очистить стек

void emptyAll (void) {

for (int iCounter = 0; iCounter ‹ iTop; iCounter ++)

if (*(array+iCounter)!= NULL) delete *(array+iCounter);

iTop = 0;

}

};

// Шаблон класса с многоуровневой отменой

template ‹class Type›

class MLTrans {

typedef ampstack‹Type› stack;

private:

Type* that; // Текущее значение

stack history; // контейнер предыдущих значений

public:

// конструктор-деструктор

MLTrans(): that(new Type) {}

~MLTrans () { delete that; }

// Сохранение текущего значения, aналог SAVE TRANSACTIONв SQLсерверах

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Идиомы и стили С++»

Представляем Вашему вниманию похожие книги на «Идиомы и стили С++» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё не прочитанные произведения.


libcat.ru: книга без обложки
libcat.ru: книга без обложки
Николай Вашкевич
Albert Baantjer: Een Rus in de Jordaan
Een Rus in de Jordaan
Albert Baantjer
Albert Baantjer: Een rat in de val
Een rat in de val
Albert Baantjer
Albert Baantjer: Moord op de Albert Cuyp
Moord op de Albert Cuyp
Albert Baantjer
Albert Cohen: Book of My Mother
Book of My Mother
Albert Cohen
Отзывы о книге «Идиомы и стили С++»

Обсуждение, отзывы о книге «Идиомы и стили С++» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.