cerr << "Error: addition is not available for matrices of different sizes" << endl;
87
exit(1);
88
}
89
unsignedshort m = first.rows;
90
unsignedshort n = first.cols;
91
CMatrix M(m,n);
92
for (unsignedshort i=0; i<m; i++)
93
for (unsignedshort j=0; j<n; j++)
94
M.mptr[i][j]=first.mptr[i][j]+second.mptr[i][j];
95
return M;
96
}
97
98
void CMatrix::randfill(constunsignedshort range)
99
{
100
for (unsignedshort i=0; i<rows; i++)
101
for (unsignedshort j=0; j<cols; j++)
102
mptr[i][j]=rand()%range;
103
return;
104
}
105
#endif
Тестирующая программа:
C++ Source Code:
1
#include"stdafx.h"
2
#include"matrix.h"
3
using std::cout;
4
5
void main ()
6
{
7
matrix A(2,2);
8
A.randfill(10);
9
matrix B(2,2);
10
B.randfill(10);
11
cout << A;
12
cout << B;
13
matrix C(2,2);
14
C = A+B;
15
cout << C;
16
return;
17
}
Собственно, стопорится на присваивании C = A+B, а именно - в месте присваивания элемента mptr[i][j]=right.mptr[i][j]. При этом нормально проходит проверку на соответствие размера. Видимо M таки из operator+ возвращается, но деструктор убивает все данные (кроме размера) заранее. Пробовал оставить деструктор пустым - всё работает. Но в таком случае, насколько я понимаю, возможна утечка памяти. Как же побороть сию проблему?
FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.
Дядя Миша писал: FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.
И что ж теперь - десяток классов наследовать? Это же изврат.
Ё-моё, только сейчас вспомнил про шаблоны с нетиповыми параметрами. Через них ведь можно заносить данные о размерах массива. Буду переделывать. А статик всё равно имел кучу минусов.
Government-Man
Вообще первое, желательно с возможностью создавать матрицы любых размеров. А уж какими средствами это будет реализовано - вопрос второстепенный, хотя и не менее важный.
Дядя Миша
Я пишу для интереса. А "самых лучших кодов" не бывает наверно.
FreeSlave это от программы зависит. Если ты пишешь программу для сложных научных математических рассчетов - то конечно флаг тебе в руки. Если же 3д движок - то такая сложность там совершенно излишняя и скажется на производительности что самое печальное.