Консультация № 110061
18.11.2007, 21:50
0.00 руб.
0 2 2
Здравствуйте.

Пишу класс для работы с матрицами перегружаю оператор [], надо чтобы при вызове к примеру a[1] возвращалась строка матрица размером 1 на n (число столбцов) (ну т.е. из матрицы выбирается только 1 строка) а если a[1][2] то нужно возвращать значение из матрицы т.е. число.

Заранее благодарен.

Обсуждение

Неизвестный
18.11.2007, 22:14
общий
это ответ
Здравствуйте, Щербинин Павел Алексеевич!
data - двумерный массив
int* operator [](int index)
{
return *(data+index);
}

Например:
data[3]
Вы хотите увидеть 3-ю строку - посылаете туда index=3...Из операторе Вам возвращается одномерный массив.

data[3][1]
После первого шага Вам вернулась третья строка...А затем из этой строки с index=1 получаете 1-й элемент...

На всяки случай:
data[3], это тоже самое, что и *(data+3)
data[3][1] в свою очередь тоже самое, что и *(*(data+3)+1)

В приложении программа с этим перегруженным оператором...Только с шаблоном класса...

Приложение:
#include<iostream.h>#include<conio.h>template <class T> class Array{T** data;int size1;int size2;public: Array(int a,int b) { data= new T*[a*b]; size1=a; size2=b; } ~Array() { delete data; cout<<endl<<"Array destroyed"; }T* operator [](int index) { return *(data+index); }void vvod(){cout<<"Input eltments of array"; for(int i=0;i<size1;i++) { for(int j=0;j<size2;j++) { gotoxy(j*8+1,i+2); cin>>*(*(data+i)+j); } }}void vyvod(){cout<<endl<<"Inputed araay: "<<endl; for(int i=0;i<size1;i++) { for(int j=0;j<size2;j++) { cout<<data[i][j]<<" "; } cout<<"\n"; }}};void main(){Array<int>a(3,3);clrscr();a.vvod();a.vyvod();getch();}
Неизвестный
19.11.2007, 04:41
общий
это ответ
Здравствуйте, Щербинин Павел Алексеевич!
Проще всего классы наподобие матриц создавать при помощи шаблонных классов. Для этого нужен шаблонный класс вектора, а класс матрицы - это вектор состоящий из векторов. Таким образом при вызове оператора [] возвращается вектор содержащий нужную строку матрицы. А вызов [][] вернет нужный элемент матрицы. Подобный код см. в приложении...

Приложение:
template <class T>class vector { T *data; int size;public: vector(int _size = 0) : size(_size) { data = new T[size]; } ~vector() { delete[] data; } void resize(int new_size) { delete[] data; size = new_size; data = new T[size]; } T& operator [] (int index) { return data[index]; } };template <class T>class matrix { vector<vector<T> > data; int n, m;public: matrix(int _n, int _m) : n(_n), m(_m) { data.resize(n); for(int i=0; i<n; i++) data[i].resize(m); } vector<T>& operator [] (int index) { return data[index]; }};
Форма ответа