Russian Qt Forum
Ноябрь 22, 2024, 17:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запарка с перегрузкой операций...  (Прочитано 5603 раз)
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);
...

Чесно говоря совершенно не представляю как это сделать  Грустный
Заранее спасибо.
Записан
sandy
Гость
« Ответ #1 : Октябрь 31, 2005, 17:13 »

Поищи Бьерна Страуструпа ("Язык С++").
Там есть подробное описание класса Matrix(n,m)
В том числе и перегруженные операторы
Да сам по себе класс, думаю неплохо реализован (если не лень изобретать велосипед)
Записан
Konstantin
Гость
« Ответ #2 : Февраль 10, 2006, 21:10 »

Что за прикол с typedef double ELEMENT_TYPE ?? :-)
О шаблонах что-нибудь слышал?
Что за точки-запятые после обьявления функций-членов?

Почему все члены класса public ?
Записан
Вудруф
Гость
« Ответ #3 : Февраль 12, 2006, 18:45 »

Вместо
  ELEMENT_TYPE matrix::operator()(int r,int c)
Писать
  ELEMENT_TYPE & matrix::operator()(int r,int c)
Т.е. возвращать ссылку на элемент, а не его значение. Можно использовать "умные указатели" и сделать для них преобразование к ELEMENT_TYPE.

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

Но что действительно стоит сделать, так это прочитать Страуструпа. Сразу столько вопросов снимется...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.