|
Программирование >> Дополнительные возможности наследования
head = pt; theCount++; template <class Type> void List<Type>;:append( Type value ) ListCell .pt = new ListCell( value ); if ( head == 0 ) head = pt; else tail->next = pt; tail = pt; theCount++; template <class Type> int List<Type>::is present( Type value ) const { if ( head == 0 ) return 0; if ( head->val == value tail->val == value ) return 1; template <class Туре> List<Type>;:List() { ListCell *pt = head; while ( pt ) { ListCell *tmp = pt; pt = pt->next; delete tmp; head = tail = 0; template <class Type> void List<Type>:;insert(Type value) ListCell pt = new ListCell( value, head ); assert (pt != 0); эта строка добавляется для обработки хвостового узла if ( head == О ) tail = pt; ListCell pt = head->next; for (; pt 1= tail; pt = pt->next) if ( pt->val == value ) return 1; return 0; 4. Объявите три списка объектов: типа Strings, типа Cat и типа int. List<String> string.list; List<Cat> Cat.Llst; List<lnt> int.List; 5. Жучки: что неправильно в приведенном ниже программном коде? (Предположите, что определяется шаблон класса List, а Cat - это класс, определенный выше в данной книге.) List<Cat> Cat.List; Cat Felix; CatList.append( Felix ); cout Felix is ( Cat List.is present( Felix ) ) ? ; not present\ n ; ПОДСКАЗКА (поскольку задание не из самых легких): подумайте, чем тип Cat отличается от типа int. В классе Cat не определен оператор operator==. Все операции, в которых сравниваются значения членов класса List, таких как is present, будут вызывать ошибку компиляции. Для уменьшения вероятности возникновения таких ошибок перед объявлением шаблона поместите обширный комментарий, в котором должно быть указано, какие операторы следует определить в классе для успешного выполнения всех его методов. 6. Объявите дружественный оператор operator== для класса List, friend int operator==( const Type& Ihs, const Type& rhs ); 7. Напишите выполнение дружественного оператора operator== для класса List, template <class Туре> int List<Type>;;operator==( const Type& Ihs, const Type& rhs ) { сначала сравниваем размеры списков if ( Ihs,theCount != rhs,theCount ) return 0; списки различны ListCell Ih = Ihs,head; ListCell *rh = rhs,head; for(; Ih != 0; Ih = lh,next, rh = rh,next ) if ( Ih,value != rh,value ) return 0; return 1; если они не различны, то совпадают 8. Грешит ли оператор operator== той же проблемой, которая существует в упражнении 5? Да. Поскольку сравнение массива включает сравнение элементов, то для элементов также должен быть определен оператор operator! =. 9. Напишите выполнение функции шаблона, осуществляющей операцию обмена данными, в результате чего две переменные должны обменяться содержимым. шаблон swap: должен иметь оператор присваивания и конструктор-копировщик, определенные для класса Туре, template <class Туре> void swap( Туре& Ihs, Туре& rhs) Type temp( Ihs ); Ihs = rhs; rhs = temp; 10. Напишите выполнение класса SchoolClass, показанного в листинге 19.8, как списка. Для добавления в список четырех студентов используйте функцию push back(). Затем пройдитесь по полученному списку и увеличьте возраст каждого студента на один год. ftinclude <list> template<class Т, class А> void ShowList(const lisKT, A>& atist); отображаем свойства вектора typedef list<Student> SchoolClass; int main() Student HarryCHarry , 18); Student SallyCSally , 15); Student Bill( Bill , 17); Student PeterCPeter , 16); SchoolClass GrowingClass; GrowingClass.push back(Harry); GrowingClass.push back(Sally); GrowingClass.push back(Bill); GrowingClass.push back(Peter); ShowLiSt(GrowingClass); cout << Один год спустя;\n ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |