#include <stdlib.h> #include <stdio.h> #include <memory.h> // nColumn and nRow counts from 1 class Matrix { double* pData; size_t nColumns; size_t nRows; public: class MatrixColumn { Matrix* pMatrix; size_t nColumn; public: MatrixColumn(Matrix* _pMatrix, size_t _nColumn) : pMatrix(_pMatrix), nColumn(_nColumn) { }; double& operator[](size_t nRow) { return (*pMatrix)(nColumn, nRow); } }; Matrix(size_t _nColumns, size_t _nRows) { nColumns = _nColumns; nRows = _nRows; pData = new double[nColumns * nRows]; memset(pData, 0, sizeof(pData[0]) * nColumns * nRows); }; ~Matrix() { delete[] pData; }; double& operator()(size_t nColumn, size_t nRow) { return pData[ ( nRow - 1 ) * nColumns + ( nColumn - 1 ) ]; }; MatrixColumn operator[](size_t nColumn) { return MatrixColumn(this, nColumn); } }; int main_func() { Matrix M(3,3); M[1][1] = 1; M[2][2] = 1; M[3][3] = 1; return 0; };Здесь на первый индекс возвращается временный объект, и при побращении через индекс к нему он уже делегирует операцию основному объекту.
В реальном коде, разумеется, нужно добавлять проверки на выход за пределы матрицы и соответствующие параллельные const операции. Впрочем, к самой технике промежуточного прокси объекта это не относится.
По быстродействию, конечно, этот вариант будет сильно хуже чем обращение к предопределенному массиву массивов. Потому этот вариант для случая когда читабельность с точки зрения математики важнее.
Комментариев нет:
Отправить комментарий