Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Это позволяет нам лучше справляться с большим количеством размерностей. Индекс [x] всегда означает отдельный индекс, выделяя отдельную строку в объекте класса Matrix; если переменная a является n мерным объектом класса Matrix, то a[x] — это (n–1)-размерный объект класса Matrix. Обозначение (x,y,z) подразумевает использование нескольких индексов, выделяя соответствующий элемент объекта класса Matrix; количество индексов должно равняться количеству размерностей.

Посмотрим, что произойдет, если мы сделаем ошибку.

void f(int n1,int n2,int n3)

{

 Matrix ai0;   // ошибка: 0-размерных матриц не бывает

 Matrix ad1(5);

 Matrix ai(5);

 Matrix ad11(7);

 ad1(7) = 0;               // исключение Matrix_error

                           // (7 — за пределами диапазона)

 ad1 = ai;                 // ошибка: разные типы элементов

 ad1 = ad11;               // исключение Matrix_error

                           // (разные размерности)

Matrix ad2(n1);  // ошибка: пропущена длина 2-й

                           // размерности

 ad2(3) = 7.5;             // ошибка: неправильное количество

                           // индексов

 ad2(1,2,3) = 7.5;         // ошибка: неправильное количество

                           // индексов

 Matrix ad3(n1,n2,n3);

 Matrix ad33(n1,n2,n3);

 ad3 = ad33;               // OK: одинаковые типы элементов,

                           // одинаковые размерности

}

Несоответствия между объявленным количеством размерностей и их использованием обнаруживается на этапе компиляции. Выход за пределы диапазона перехватывается на этапе выполнения программы; при этом генерируется исключение Matrix_error.

  Первая размерность матрицы — это строка, а вторая — столбец, поэтому индекс — это двумерная матрица (двумерный массив), имеющая вид (строка,столбец). Можно также использовать обозначение [строка][столбец], так как индексирование двумерной матрицы с помощью одномерного индекса порождает одномерную матрицу — строку. Эту ситуацию можно проиллюстрировать следующим образом.

Этот объект класса Matrix размещается в памяти построчно.

Класс Matrix знает свою размерность, поэтому его элементы можно очень просто передавать как аргумент,

void init(Matrix& a) // инициализация каждого элемента

                            // характеристическим значением

{

  for (int i=0; i

    for (int j = 0; j

      a(i,j) = 10*i+j;

}

void print(const Matrix& a) // вывод элементов построчно

{

  for (int i=0; i

    for (int j = 0; j

      cout << a(i,j) <<'\t';

    cout << '\n';

  }

}

  Итак, dim1 — это количество элементов в первой размерности, dim2 — количество элементов во второй размерности и т.д. Тип элементов и количество размерностей являются частью класса Matrix, поэтому невозможно написать функцию, получающую объект класса Matrix как аргумент (но можно написать шаблон).

void init(Matrix& a); // ошибка: пропущены тип элементов

                      // и количество размерностей

Обратите внимание на то, что библиотека Matrix не содержит матричных операций, например, сложение двух четырехмерных матриц или умножение двумерных матриц с одномерными. Элегантная реализация этих операций выходит за рамки этой библиотеки. Соответствующие матричные библиотеки можно надстроить над библиотекой Matrix (см. упр. 12). 

<p id="AutBody_Root468"><strong>24.5.2. Одномерный объект класса Matrix</strong></p>

Что можно сделать с простейшим объектом класса Matrix — одномерной матрицей?

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

Matrix a1(8); // a1 — это одномерная матрица целых чисел

Matrix a(8);    // т.е. Matrix a(8);

Таким образом, объекты a и a1 имеют одинаковый тип (Matrix). У каждого объекта класса Matrix можно запросить общее количество элементов и количество элементов в определенном измерении. У одномерного объекта класса Matrix эти параметры совпадают.

a.size; // количество элементов в объекте класса Matrix

a.dim1; // количество элементов в первом измерении

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже