Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
10.12.2013
Размер:
34.3 Кб
Скачать

Министерство среднего и профессионального образования РФ

Пермский государственный технический университет

Кафедра автоматизированных систем управления

Лабораторная работа №2

Шаблоны классов.

Выполнил: Серебров А.Л.

Проверил: Ноткин А.М.

Пермь

2001

Лабораторная работа №2.

Цель. Получить практические навыки создания шаблонов и использования их в программах С++.

Основное содержание работы. Создать шаблон заданного класса и использовать его для данных различных типов.

Постановка задачи.

В данной задаче нужно реализовать шаблон для реализации АДТ однонаправленный список. Дополнительно требуется перегрузить следующие операции:

“+” -добавить элемент в начало списка (элемент+list);

“--” -удалить элемент из начала списка (типа –list);

“==” проверка на равенство списков.

Вариант задания №8.

Реализуется класс List.

Поля:

  • *s – элементы списка;

  • int len – текущая длина списка;

  • int max – максимально возможная длина списка;

  • int cur – текущий элемент в списке;

Методы:

  • List() – конструктор без параметров, список максимально возможной длины;

  • List(const <массив>, int) – в список заносятся элементы массива, список максимально возможной длины;

  • List(const <элемент >, int M) - в список заносятся элемент М раз;

  • List(const List &L) – копирующий конструктор;

  • ~List() – деструктор;

  • void Input() – ввод списка с клавиатуры;

  • void Show() – вывод списка на экран;

  • int Len() – получение текущей длины списка;

  • <указатель на начало списка > GetList() – получение списка;

  • <элемент> Get() – получить текущий элемент:

  • void Next() – перейти к следующему элементу;

  • void Back() - перейти к предыдущему элементу;

  • void SetCur(int T) – установить текущий элемент списка;

  • List operator+(const <элемент>, const List& T) – перегрузка операции «+», добавление элемента в список типа +List;

  • <элемент> operator--() – перегрузка операции «--»,удаление элемента из начала списка типа --List;

  • <элемент> operator[](int T) – получить элемент по индексу;

  • int operator==(const List &L) – перегрузка операции «==», проверка списков на равенство;

  • List& operator=(const List &L) – перегрузка операции «=»;

Определение класса.

template <class ls> class List{

protected:

ls *s;

int len, max, cur;

public:

List();

List(const ls *C, int M);

List(const ls C, int M);

List(const List &L);

~List();

void Input();

void Show();

int Len();

ls* GetList();

ls Get();

void Next();

void Back();

void SetCur(int T);

friend List operator+(ls, List<ls>&);

// friend ostream& operator<<(ostream&, const List<ls>&);

// friend istream& operator>>(istream&, const List<ls>&);

List operator+(const ls C);

ls operator--();

ls operator[](int T);

int operator==(const List &L);

List& operator=(const List &L);

};

В качестве пользовательского класса используется класс Complex:

class Complex{

int im, re;

public:

Complex(); //Конструктор без параметров

Complex(int, int); // Конструктор с параметрами

Complex(const Complex&); // Копирующий конструктор

Complex operator+(const Complex&); //Перегрузка +

Complex& operator=(const Complex&); // Перегрузка =

int operator==(const Complex&); // Перегрузка равенства

friend ostream& operator<<(ostream&, const Complex&); //Вывод

friend istream& operator>>(istream&, Complex&); //Ввод

};

Обоснование.

В данный класс включены четыре конструктора – без параметров, два с параметрами и копирующий. В процессе инициализации объекта в куче резервируется место для списка. Максимальный размер списка должен быть известен. Для этого используются конструкторы с параметрами и без. Конструктор без параметров нужен так же для возможности создания динамических объектов. Конструктор-копировщик предоставляемый по умолчанию не устраивает нас из-за механизма поверхностного копирования поэтому он перекрывается.

Деструктор вводится для того чтобы освободить память распределенную во время создания объекта.

Оператора присваивания перегружается опять же по причине поверхностного копирования.

Тестовые данные и результаты тестирования.

Шаблон был протестирован на следующих типах данных:

  • int

  • double

  • char

  • Complex

Также были проверена работа всех функций-членов для данных типов. Тесты прошли не успешно, программа работает верно.