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

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

Жанры

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

Makhmutov Albert

Шрифт:

#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; }

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

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Мир Возможностей

Бондаренко Андрей Евгеньевич
1. Мир Возможностей
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Мир Возможностей

От океана до степи

Стариков Антон
3. Игра в жизнь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
От океана до степи

В прятки с отчаянием

AnnysJuly
Детективы:
триллеры
7.00
рейтинг книги
В прятки с отчаянием

Гранд империи

Земляной Андрей Борисович
3. Страж
Фантастика:
фэнтези
попаданцы
альтернативная история
5.60
рейтинг книги
Гранд империи

Фронтовик

Поселягин Владимир Геннадьевич
3. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Фронтовик

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Мама из другого мира. Дела семейные и не только

Рыжая Ехидна
4. Королевский приют имени графа Тадеуса Оберона
Любовные романы:
любовно-фантастические романы
9.34
рейтинг книги
Мама из другого мира. Дела семейные и не только

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Сделать выбор

Петрова Елена Владимировна
3. Лейна
Фантастика:
юмористическое фэнтези
попаданцы
8.43
рейтинг книги
Сделать выбор

Ни слова, господин министр!

Варварова Наталья
1. Директрисы
Фантастика:
фэнтези
5.00
рейтинг книги
Ни слова, господин министр!

Невеста инопланетянина

Дроздов Анатолий Федорович
2. Зубных дел мастер
Фантастика:
космическая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Невеста инопланетянина

Единственная для невольника

Новикова Татьяна О.
Любовные романы:
любовно-фантастические романы
5.67
рейтинг книги
Единственная для невольника

Весь Роберт Маккаммон в одном томе. Компиляция

МакКаммон Роберт Рик
Абсолют
Фантастика:
боевая фантастика
5.00
рейтинг книги
Весь Роберт Маккаммон в одном томе. Компиляция