БлогNot. Переопределяем двойные квадратные скобки на C++

Переопределяем двойные квадратные скобки на C++

Речь о том, как переопределить оператор квадратных скобок [] "дважды", чтобы выражение вида a[i][j] работало в шаблоне класса из объектов любого скалярного типа, и слева, и справа от знака присваивания.

Вот здесь подобного не делалось, хотя способы организовать двумерный контейнер из стандартного вектора STL показаны.

Ничего лучше, чем ввести вспомогательный класс "строка матрицы" и в нём также переопределить оператор квадратных скобок, мне в голову не пришло.

Пример, показанный ниже, сработал, проверен в консолях QT 5.X и Visual Studio 2015.

#include <iostream>
#include <iomanip>
using namespace std;

template <typename T> class Matrix {
private:
 int n,m;
 T **data;
public:
  Matrix(int n=2, int m=2) {
   if (n < 2) n = 2;
   if (m < 2) m = 2;
   this->n = n;
   this->m = m;
   data = new T *[n];
   for (int i = 0; i < n; i++) {
    data[i] = new T [m];
    for (int j = 0; j < m; j++) data[i][j] = (T)0;
   }
  }

  class MatrixRow {
   private:
    Matrix & matr;
    size_t _row;
   public:
    MatrixRow (Matrix & m, size_t row) : matr(m), _row(row) {}
    MatrixRow (T * _array) : _row(_array) {}
    T & operator [] (size_t col) {
     return matr.data[_row][col];
    }
  };

  MatrixRow operator [] (size_t index) {
   return MatrixRow(*this, index);
  }

  void show (int width=4) {
   for (int i=0; i<n; i++) {
    for (int j=0; j<m; j++) cout << setw(width) << data[i][j];
    cout << endl;
   }
  }
};

int main() {
 Matrix <double> a(2,2);
 a[1][1] = 1;
 a[0][0] = a[1][1] + 1;
 a.show();
 cin.get();
 return 0;
}

теги: c++ программирование

06.05.2019, 21:11; рейтинг: 58

  свежие записипоиск по блогукомментариистатистикао "вирусах" в архивах .zip

Наверх Яндекс.Метрика
© PerS
вход