Программирование / Лабораторные / АСУ-Отчет по С++ №2 / Отчет по С++ №2
.docМинистерство среднего и профессионального образования РФ
Пермский государственный технический университет
Кафедра автоматизированных систем управления
Лабораторная работа №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
Также были проверена работа всех функций-членов для данных типов. Тесты прошли не успешно, программа работает верно.