Объектно-ориентированное программирование на C++. Андрианова А.А - 117 стр.

UptoLike

Объектно-ориентированное программирование на С++
{
if(n == ob.n)
{
QMatrix temp(ob.n);
for(int i = 0; i < n; i++)
for(int j = 0; j < ob.n; j++)
for(int k = 0; k < n; k++)
temp.a[i][j] = temp.a[i][j] +
(a[i][k] * ob.a[k][j]);
return temp;
}
else
throw 1;
}
На основе этого шаблона можно создавать объекты сгенерированных
классов QMatrix с указанием конкретных типов данных для элементов
матрицы (int, double, Complex комплексное число, Fraction
дробь и т.д.). При генерации класса с указанием пользовательских типов
данных нужно убедиться, что данный пользовательский тип содержит
переопределение основных функций и операций, которые используются в
методах шаблона. Например, пусть разработан класс «Рациональная
дробь» Fraction и создается матрица, элементами которой являются
рациональные дроби:
QMatrix<Fraction> ob(4);
При таком создании объекта происходит генерация класса QMatrix
с элементами типа Fraction (также будут сгенерированы все методы
этого класса). Затем будет вызван сгенерированный конструктор с одним
параметром. При выполнении данного конструктора (его определение
было указано выше) происходит инициализация элементов матрицы
нулями. Для инициализации дроби необходимо, чтобы в классе
Fraction был определен конструктор с одним параметром целого типа,
который преобразует целое число (в данном случае 0) в дробь.
Для корректной работы метода сложения двух матриц придется
определить в классе Fraction операторы присваивания и сложения
двух дробей.
Особое внимание следует обратить на использование дружественных
функций в шаблонах классов. Часто с помощью дружественных функций
переопределяются операции ввода/вывода для конкретного класса. При
117
                           Объектно-ориентированное программирование на С++
     {
          if(n == ob.n)
          {
               QMatrix temp(ob.n);
               for(int i = 0; i < n; i++)
                    for(int j = 0; j < ob.n; j++)
                         for(int k = 0; k < n; k++)
                              temp.a[i][j] = temp.a[i][j] +
                                        (a[i][k] * ob.a[k][j]);
               return temp;
          }
          else
             throw 1;
     }

    На основе этого шаблона можно создавать объекты сгенерированных
классов QMatrix с указанием конкретных типов данных для элементов
матрицы (int, double, Complex – комплексное число, Fraction –
дробь и т.д.). При генерации класса с указанием пользовательских типов
данных нужно убедиться, что данный пользовательский тип содержит
переопределение основных функций и операций, которые используются в
методах шаблона. Например, пусть разработан класс «Рациональная
дробь» Fraction и создается матрица, элементами которой являются
рациональные дроби:

     QMatrix ob(4);

    При таком создании объекта происходит генерация класса QMatrix
с элементами типа Fraction (также будут сгенерированы все методы
этого класса). Затем будет вызван сгенерированный конструктор с одним
параметром. При выполнении данного конструктора (его определение
было указано выше) происходит инициализация элементов матрицы
нулями. Для инициализации дроби необходимо, чтобы в классе
Fraction был определен конструктор с одним параметром целого типа,
который преобразует целое число (в данном случае 0) в дробь.
    Для корректной работы метода сложения двух матриц придется
определить в классе Fraction операторы присваивания и сложения
двух дробей.
    Особое внимание следует обратить на использование дружественных
функций в шаблонах классов. Часто с помощью дружественных функций
переопределяются операции ввода/вывода для конкретного класса. При

                                                                       117