Название: Запарка с перегрузкой операций...
Отправлено: mks от Октябрь 29, 2005, 22:54
Начал писать библиотеку для работы с матрицами, хочу сделать ее объектно ориентированой, но сталкнулся с одной проблемой... есть такой класс матрицы: matrix.h: typedef double ELEMENT_TYPE;
class matrix { public: int col,row; // col - количество строк // row - количество столбцов
ELEMENT_TYPE *data; // сдесь хранятся элементы матрицы
~matrix(); matrix(int r,int c); void init(ELEMENT_TYPE a); // инициализация матрицы matrix operator+(matrix m); // сумма 2-х матриц matrix operator-(matrix m); // разность 2-х матриц
ELEMENT_TYPE operator()(int r,int c); // проблема в этих void operator=(ELEMENT_TYPE a); // 2-х функциях
};
matrix.cpp: #include "matrix.h"
//////////////////////////////////////////////////////////////////////////
void matrix::init(ELEMENT_TYPE a) { int i,j; for (i=0;i<row;i++) for (j=0;j<col;j++) { data[i*row+j] = a; } };
//////////////////////////////////////////////////////////////////////////
matrix::matrix(int r,int c) { col = c; row = r; data = new ELEMENT_TYPE[col*row]; };
//////////////////////////////////////////////////////////////////////////
matrix::~matrix() { delete [] data; };
//////////////////////////////////////////////////////////////////////////
matrix matrix::operator +(matrix m) { int i,j; matrix temp(row,col); for (i=0;i<row;i++) for (j=0;j<row;j++) { temp.data[i*row+j] = data[i*row+j] + m.data[i*row+j]; } return temp; };
//////////////////////////////////////////////////////////////////////////
matrix matrix::operator -(matrix m) { int i,j; matrix temp(row,col); for (i=0;i<row;i++) for (j=0;j<row;j++) { temp.data[i*row+j] = data[i*row+j] - m.data[i*row+j]; } return temp; };
//////////////////////////////////////////////////////////////////////////
ELEMENT_TYPE matrix::operator()(int r,int c) { return data[(r-1)*row+(c-1)]; };
//////////////////////////////////////////////////////////////////////////
void matrix::operator=(ELEMENT_TYPE a) { }
Собственно вопрос такой: как мне перегрузить операции () и = чтобы в тексте программы была возможна такая запись: ... int i,j,k; matrix a(n,n); ... a(j,k) = a(j,k)-a(j,i)*a(i,k); ...
Чесно говоря совершенно не представляю как это сделать :( Заранее спасибо.
Название: Re: Запарка с перегрузкой операций...
Отправлено: sandy от Октябрь 31, 2005, 17:13
Поищи Бьерна Страуструпа ("Язык С++"). Там есть подробное описание класса Matrix(n,m) В том числе и перегруженные операторы Да сам по себе класс, думаю неплохо реализован (если не лень изобретать велосипед)
Название: Re: Запарка с перегрузкой операций...
Отправлено: Konstantin от Февраль 10, 2006, 21:10
Что за прикол с typedef double ELEMENT_TYPE ?? :-) О шаблонах что-нибудь слышал? Что за точки-запятые после обьявления функций-членов?
Почему все члены класса public ?
Название: Запарка с перегрузкой операций...
Отправлено: Вудруф от Февраль 12, 2006, 18:45
Вместо ELEMENT_TYPE matrix::operator()(int r,int c) Писать ELEMENT_TYPE & matrix::operator()(int r,int c) Т.е. возвращать ссылку на элемент, а не его значение. Можно использовать "умные указатели" и сделать для них преобразование к ELEMENT_TYPE.
Правильно сказали про шаблоны...
Но что действительно стоит сделать, так это прочитать Страуструпа. Сразу столько вопросов снимется...
|