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

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

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

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

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

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

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

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

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


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

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

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

Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

void Push() {

history.push(that);

that = new Type(*that);

}

// удаление промежуточных состояний

void Commit () { history.emptyAll(); }

// Откат на одну позицию; уничтожает текущее значение.

void PopOne() {

if (!history.isEmpty()) {

delete that;

that = history.pop();

}

}

// Откат к началу транзакции.

void Rollback() {

Type* old = history.pop();

Type* older = NULL;

if (old!= NULL) {

while ((older = history.pop())!= NULL) {

delete old;

old = older;

}

delete that;

that = old;

}

}

// Переопределенный operator-›

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

}

// проверим работу

int main() {

int t;

MLTrans‹CType› a;

a-›set(5);

t = a-›get();

a.Push();

a-›set(6);

t = a-›get();

a.Push();

t = a-›get();

a-›set(7);

t = a-›get();

a.Push();

t = a-›get();

a-›set(9);

t = a-›get();

// a.Push();

t = a-›get();

a.PopOne();

t = a-›get();

a.Rollback();

t = a-›get();

return 0;

}

Шаг 24 - Как создавать ТОЛЬКО локальные переменные.

В Шаге 17 мы изыскали способ подавить создание локальных переменных. Решим обратную задачу - как подавить иные способы их создания. А какие иные? Любые другие способы предполагают вызов оператора operator new()для выделения памяти и потом вызов конструктора. Значит, надо объявить operator new()закрытым членом класса, да и все. Ничего в нем делать не надо, а сразу назад. Попробуем?

class CNoHeap {

public:

int a;

private:

void* operator new(size_t size) { return NULL; }

};

int main () {

/*

CNoHeap* firstTestNoHeap = new CNoHeap; // Не откомпилируется

*/

CNoHeap secondTestNoHeap; // А это пожалуйста.

return 0;

}

Теперь, если определить макрос:

#define DECLARE_LOCAL \

private: \

void* operator new(size_t size) { return NULL; }

и потом вкладывать его во всякие разные объекты, отвечающие за захват и освобождение ресурсов, то получится весьма удобно; Вы ГАРАНТИРОВАННО освободите любые ресурсы, захваченные в конструкторе и освобождаемые в деструкторе, в том числе в исключении. В любом случае, всякое ограничение уменьшает энтропию.

Для Шага 17, где мы рисовали производящие и разрушающие функции, тоже можно нарисовать макрос… и назвать его DECLARE_DYNCREATE. То есть, я хочу сказать, что Вы можете аккуратно переписать нужное из него в свою версию, а в результате получите

class CSomeClass {

DECLARE_NOLOCAL

public:

bool Initialize (param list);

};

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

Шаг 25 - Как сделать виртуальной свободную функцию.

Чаще всего этот прием я видел в отношении оператора operator‹‹. Точнее, не чаще, а всегда. На нем и разберем. Пусть у нас есть иерархия классов, и мы хотим определить диагностическую функцию Dump(). Она должна вываливать диагностику в заданное что-то ( CDestination). У нас есть два варианта: или сделать функцию виртуальной в иерархии классов:

class CBase {

virtual void Dump(CDestination& ds) = 0;

};

class CFirst: public CBase {

void Dump (CDestination& ds);

};

class CSecond: public CBase {

void Dump (CDestination& ds);

};

Или перегружать ее для каждого класса иерархии или в классе, или в свободной функции:

CDestination {

void Dump (CFirst& fs);

void Dump (CSecond& sc);

};

void Dump (CDestination& ds, CThird& td);

void Dump (CDestination& ds, CFourth& fr);

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

Но у второго варианта есть одно преимущество: функцию Dump()можно обозвать оператором operator‹‹, и это будет выглядеть весьма презентабельно:

// Это декларация

CDestination {

CDestination& operator‹‹ (CFirst& fs);

};

CDestination& operator‹‹ (CDestination& ds, CSecond& sc);

// А это применение

dStream ‹‹ dObject;

Как сделать так, чтобы сохранить замечательное полиморфное поведение первого варианта, и применить эту радость идиота operator‹‹? Легко: пусть operator‹‹вместо реальной работы просто вызывает виртуальную Dump(). Именно так сделано в MFC- объект afxDumpвызывает виртуальную Dump()именно через operator‹‹. (Можно что угодно говорить про Microsoft, но факт есть факт - огромное число полезных и интересных приемов использовано в их продуктах и "… взять их у нее - наша задача!").

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

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

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

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


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
Отзывы о книге «Идиомы и стили С++»

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