|
Программирование >> Инициализация объектов класса, структура
#include <iostream> #include ilist.h int main() { ilist mylist; for ( int ix = 0; ix < 10; ++ix ) { mylist.insert front( ix ); mylist.insert end( ix ); cout << \n << Применение init iter() и next iter() << для обхода всех элементов списка:\n ; ilist item *iter; for ( iter = mylist.init iter(); iter; iter = mylist.next iter() ) cout << iter->value() << ; cout << \n << Применение копирщего конструктора\n ; ilist mylist2( mylist ); mylist.remove all(); for ( iter = mylist2.init iter(); iter; iter = mylist2.next iter() ) cout << iter->value() << ; cout << \n << Применение копирщего оператора присваивания\n ; mylist = mylist2; for ( iter = mylist.init iter(); iter; iter = mylist.next iter() ) cout << iter->value() << ; cout << \n ; Результат работы программы: Применение init iter() и next iter() для обхода всех элементов списка: 9 8 7 6 5 4 3 21 0 0 1 2 3 45 6 7 8 9 Применение копирующего конструктора 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 Применение копирующего оператора присваивания 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 5.11.1. Обобщенный список Наш класс ilist имеет серьезный недостаток: он может хранить элементы только целого типа. Если бы он мог содержать элементы любого типа - как встроенного, так и определенного пользователем, - то его область применения была бы гораздо шире. Модифицировать ilist для поддержки произвольных типов данн1х позволяет механизм шаблонов (см. главу 16). template <class elemType> перед которым стоит ключевое слово class или typename. Например: class list item; Эта инструкция объявляет list item шаблоном класса с единственным нараметром- template <typename elemType> типом. Следующее объявление эквивалентно предыдущему: class list item; Ключевые слова class и typename имеют одинаковое значение, можно использовать любое из них. Более удобное для запоминания typename появилось в стандарте С++ сравнительно недавно и поддерживается еще не всеми компиляторами. Поскольку наши тексты были написаны до появления этого ключевого слова, в них употребляется class. Шаблон класса list item выглядит так: При использовании шаблона вместо параметра подставляется реальный тип данных. Например: list< string > slist; создает экземпляр списка, способного содержать объекты типа string, а list< int > ilist; создает список, в точности повторяющий наш ilist. С помощью шаблона класса можно обеспечить поддержку произвольных типов данных одним экземпляром кода. Рассмотрим последовательность действий, уделив особое внимание классу list item. Определение шаблона класса начинается ключевым словом template, затем следует список параметров в угловых скобках. Параметр представляет собой идентификатор, template <class e class list item { elemType> public: list item( elemType value, list item *item = 0 ) : value( value ) { if ( !item ) next = 0; else { next = item-> next; item-> next = this; elemType value() { return value; } list item* next() { return next; } void next( list item *link ) { next = link; } void value( elemType new value ) { value = new value; } private: elemType value; list item * next; Все упоминания типа int в определении класса ilist item заменены на параметр elemType. Когда мы пишем: list item<doub1e> *ptr = new list item<doub1e>( 3.14 ); компилятор подставляет double вместо elemType и создает экземпляр list item, поддерживающий данный тип. Аналогичным образом модифицируем класс ilist в шаблон класса list:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |