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

Тут можно читать онлайн Albert Makhmutov - Идиомы и стили С++ - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Идиомы и стили С++
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.13/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Albert Makhmutov - Идиомы и стили С++ краткое содержание

Идиомы и стили С++ - описание и краткое содержание, автор Albert Makhmutov, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Идиомы и стили С++ - читать книгу онлайн бесплатно, автор Albert Makhmutov
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

#include ‹iostream.h›

class CNoChange;

class CBase {

public:

virtual void passTo (CNoChange& _cb) { cout ‹‹ "base passed" ‹‹ endl; }

};

class CFirst: public CBase {

public:

void passTo (CNoChange& _cb) { cout ‹‹ "first passed" ‹‹ endl; }

};

class CSecond: public CBase {

public:

void passTo (CNoChange& _cb) { cout ‹‹ "second passed" ‹‹ endl; }

};

class CNoChange {

public:

int a;

// Это вариант с оператором - членом класса.

CNoChange& operator‹‹ (CBase& _cb) { _cb.passTo(*this); return *this; }

};

// а это - свободная функция.

//CNoChange& operator‹‹ (CNoChange& _nc, CBase& _cb)

// {_cb.passTo(_nc); return _nc;};

// проверить надо.

int main() {

CNoChange nc;

CFirst fs;

CSecond sc;

nc‹‹fs;

nc‹‹sc;

return 0;

}

Шаг 26 - Как сделать массив из чего угодно. Продолжение 2.

Итераторы.

В Шагах 15 и 16 мы повозились с имитацией массива (коллекцией). Мы добились нормальной работы при чтении и записи в ячейки массива. Но работа с массивом этим не ограничивается. Вот захочется нам сделать что-то со всеми элементами массива, а он индексирован по строке.

// Бред

for (string cCounter= "a"; a ‹ "zzzz"; a++) array.[cCounter].doit();

Нет, это неправильно. Нужно сделать так, чтобы коллекция сама себя перебирала.

CIndex index = array.getStart();

while (!array.eof()) {

index = array.getIndex ();

array[index].doIt();

array.getNext();

};

Ну вот, на что-то похоже. Появился некий элемент indexкласса CIndex, без которого в принципе можно обойтись, если коллекция будет хранить текущее значение перебора внутри себя. Но вот беда - если вдруг коллекцию захотят перебрать разные клиенты? Ну глобальная она, существует вместе с программой, а обращаются к ней разные объекты, как себя перебрать бедной коллекции? В общем, подход тут такой же, как и в жизни: тебе надо, ты и шевелись, в смысле перебирай. Упомянутый выше indexтут как нельзя кстати. Называем его Зингельшухером… (oops!) Простите - итератором, объявляем его дружественным коллекции, прописываем в него текущую позицию, пишем скромный набор функций навигации типа goFirst, goNext, isLast. В зависимости от того, где мы их пишем, итератор будет или активным - если функции навигации в нем, или пассивным - если они лежат в коллекции.

Итак, что делаем: в шаблон ampstack‹Type›из Шага 23 вписываем дружбу к классу итератора:

friend class ampIter;

и сам шаблон класса итератора:

// Класс итератора, дружественный нашему стеку.

template ‹class Type›

class ampIter {

private:

ampstack‹Type›* m_stack;

int iPosition;

public:

ampIter(ampstack‹Type›* _as = NULL) : m_stack(_as), iPosition (0) {}

int isLast(void) { return iPosition + 1 - m_stack-›iTop; }

void moveStart(void) {iPosition = 0; }

Type* moveNext(void) { return m_stack-›array[iPosition++]; }

};

Итераторы - это тема, граничащая с безумием. Мы вовремя остановились на активном итераторе, шаблоне, не вложенном, с семантикой указателей. А ведь их можно вкладывать (т.е. объявлять класс итератора внутри класса коллекции), связывать с курсорами, перегружать их операторы, изменять семантику, вводить многопоточность, создавать внутри (!) итератора мгновенную частную копию коллекции и это только начало. По счастью, о нас уже позаботился Алексей Степанов, и подарил нам Библиотеку Стандартных Шаблонов - Standart Template Library, полную итераторов, равно коллекций и алгоритмов. Немного о них можно почитать на этом же сайте в разделе VC++-›STL у Артема Каева, а много - в MSDN.

Так же добавлю, что пользуюсь при подготовке Шагов компилятором BC3.1, а он поддерживает шаблоны не вполне так, как это делают современные компиляторы. То есть, если Вы просто скопируете код, вероятно он сразу даже не откомпилируется. Так что предупреждаю - если собираетесь пользоваться шаблонами - проверьте, что на эту тему думает компилятор (а так же насчет исключений и операторов вида xxxxxxx_cast‹›()).

Мне же итератор нужен был исключительно для следующих Шагов, а совпадения фамилий, характеров и событий прошу считать случайными.

Шаг 27 - Умные указатели. Перегрузка operator*, operator(),operator-›*.

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

obj = *(smart_ptr);

(obj-›*ptr_to_funct) (some_parameter);

С первой проблемой рассчитаться легко. Если Вы НЕ читаете сейчас этот Шаг, не беспокойтесь - решение придет само, в тот момент, когда задача возникнет.

//Ясно, это реализации перегруженных операторов-селекторов.

CSmth* operator-›() const { return prt_real; }

CSmth& operator* () const { return *ptr_real; }

operator CSmth* () const { return ptr_real; }

А что вторая проблема? Да, тут ситуация намного серьезнее, и если Вы опять-таки не читаете этот Шаг, то нужно немедленно прочесть его - или первоисточник - статью Мейерса в Dr. Dobb's Journal. Только там придется продираться через тучные стада шаблонов и долгих рассуждений. Без шаблона конечно не обойтись, но нужно ухватить хотя бы идею. Поэтому сделаем так, как нормальный человек читает детективы Марининой: первые и последние две страницы.

Сначала, кто такой operator-›*. Это который вызывает функцию-член по указателю. Такую функцию нужно вызывать с указанием объекта, если из другой функции-члена, то в виде (this-›*mpf)()или (*this).*mpf().

// Этот класс используется так же дальше

class CSmth {

public:

int a;

int pf (void) {return a;}

};

typedef int (CSmth::*PF)(void);

Если мы нарисуем умный указатель на объект класса CSmth, определять operator-›*()нужно самостоятельно. Что он должен вернуть? Нечто такое, к чему можно применить operator(). То есть, это снова proxy-объект. Мейерс называет его "незавершенный вызов функции-члена" ( Pending Member Function Calling). Он должен знать, к какому объекту применяется, и знать об указателе на функцию, то есть он должен иметь в себе указатели на них обоих, и инициализировать их в конструкторе. А operator()должен возвращать уже нужный нам int, или все что угодно другое, что может вернуть указываемая функция.

// класс незавершенного вызова. Это самое важное.

class pmfc {

private:

// два указателя - на объект и на функцию

CSmth* m_smth;

PF m_pfunct;

public:

// конструктор

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Albert Makhmutov читать все книги автора по порядку

Albert Makhmutov - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Идиомы и стили С++, автор: Albert Makhmutov. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x