Лабораторная работа «Параметризованные классы»

Ключевые понятия: полиморфизм, параметрический полиморфизм, параметризованный класс

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

Задание кафедры:

Реализовать на языке C++ параметризованный класс «Матрица», типы элементов которого могут быть заданы в соответствии с вариантом.

Вар Тип 1 Тип 2 Возможность класса
  Комплексное число Интервальное число Сложение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A+B
  Разность двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A-B
  Умножение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A*B
  Умножение матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A*b, где b – вещественное число
  Умножение вещественного числа на матрицу и присвоение результата третьей переменной-матрице осуществляется одной строкой C=b*A, где b – вещественное число
  Деление матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A/b, где b – вещественное число
  Вектор в декартовой системе N координат Вектор в полярных координатах Сложение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A+B
  Разность двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A-B
  Умножение матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A*b, где b – вещественное число
  Умножение вещественного числа на матрицу и присвоение результата третьей переменной-матрице осуществляется одной строкой C=b*A, где b – вещественное число
  Деление матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A/b, где b – вещественное число
  Комплексное число Вектор в полярных координатах Сложение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A+B
  Разность двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A-B
  Умножение матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A*b, где b – вещественное число
  Умножение вещественного числа на матрицу и присвоение результата третьей переменной-матрице осуществляется одной строкой C=b*A, где b – вещественное число
  Деление матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A/b, где b – вещественное число
  Вектор в декартовой системе N координат Комплексное число Сложение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A+B
  Разность двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A-B
  Умножение матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A*b, где b – вещественное число
  Умножение вещественного числа на матрицу и присвоение результата третьей переменной-матрице осуществляется одной строкой C=b*A, где b – вещественное число
  Деление матрицы на вещественное число и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A/b, где b – вещественное число

 

Содержание отчета: сведения об авторе и работе, задание кафедры, цель работы, текст программы (указать в комментариях: назначение всех элементов параметрического полиморфизма, назначение всех методов и перегруженных операторов, необходимых для реализации параметрического полиморфизма), выводы.

Контрольные вопросы:

1. Зачем нужны параметризованные классы?

2. Какой из механизмов ООП реализуется с использованием параметризованных классов?

3. Что такое шаблон класса?

4. Во сколько раз сокращается исполняемый машинный код программы при использовании параметризованных классов?

5. Какого вида могут быть параметры при задании шаблона класса?

Пример программы

//класс вещество, содержащий температуру и массу

class Substance {

double Mass;

double Temperature;

public:

//требуется перегрузка оператора сложения для класса Substance, так как данная операция совершается в классе Matrix. Без данной перегрузки компилятор выдаст ошибку

Substance operator + (Substance c) {

Substance res;

res.Mass = this ->Mass + c.Mass;

res.Temperature = (this->Temperature*this->Mass +

c.Temperature*c.Mass) / (this->Mass + c.Mass);

return res;

}

//так как метод rand_val вызывается из класса Matrix, то данный метод должен обязательно присутствовать в классе Substance

static Substance rand_val() {

Substance res;

res.Mass = (rand() % 2000) / 100.0 + 5;

res.Temperature = (rand() % 2000) / 100.0 + 10;

return res;

}

//так как метод to_str вызывается из класса Matrix, то данный метод должен обязательно присутствовать в классе Substance

void to_str(char* bufer) {

sprintf(bufer, "M=%.2lf;T=%.2lf", Mass, Temperature);

}

};

 

//определение шаблонного класса Matrix, который позволяет хранить матрицу из объектов, которые имеются тип T

template < class T >

class Matrix {

//определение массива элементов типа T

T m[4][4];

public:

Matrix () {

for (int i = 0; i < 4; i++)

for (int j = 0; j < 4; j++)

m[i][j] = T::rand_val();

}

//запись T::rand_val() в шаблонном классе предполагает наличие у класса T публичного статического метода rand_val. Программа не может быть собрана, если у класса T нет данного метода.

 

void print() {

char * bufer = new char [100];

printf("Matrix\n");

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 4; j++) {

m[i][j].to_str(bufer);

printf("%s\t", bufer);

}

printf("\n");

}

printf("\n");

delete bufer;

}

//запись m[i][j].to_str(bufer) для элемента (он имеет тип T) массива m предполагает наличие метода to_str у класса T. Программа не может быть собрана, если у класса T нет данного метода.

 

Matrix operator + (Matrix &b) {

Matrix < T > res;

for (int i = 0; i < 4; i++)

for (int j = 0; j < 4; j++)

res.m[i][j] = this->m[i][j] + b.m[i][j];

return res;

}

//операция сложения между экземплярами класса T (это - this->m[i][j] и b.m[i][j]) предполагает наличие у класса T перегруженного оператора сложения. Программа не может быть собрана, если у класса T нет данного перегруженного оператора.

};

 

//класс Substance имеет статический метод rand_val(), метод to_str() и перегруженный оператор сложения, поэтому он может быть использован в качестве параметра шаблонного класса Matrix.

void main () {

Matrix < Substance > m1;

m1.print();

Matrix < Substance > m2;

m2.print();

Matrix < Substance > m3 = m1 + m2;

m3.print();

}

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: