Russian Qt Forum

Программирование => С/C++ => Тема начата: mks от Октябрь 29, 2005, 22:54



Название: Запарка с перегрузкой операций...
Отправлено: 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.

Правильно сказали про шаблоны...

Но что действительно стоит сделать, так это прочитать Страуструпа. Сразу столько вопросов снимется...