Моя задача состоит в том, что мне требуется перегрузить дружественные(те, которые, конечно, могут ими быть)) операторы "[][]", "=", "+", "*", "-", "<=", ">=", "+="(прибавление ко всем элементам матрицы какого-то числа), но у меня возникает проблема с "=" и "+=". Предоставляю код.
Заголовочный файл
Код:
#include <fstream>
#include <iostream>
class Matrix
{
public:
double** matrix; // матрица
int rows; // количество строк
int cols; // количество столбцов
Matrix(int rows_0, int cols_0);
Matrix(Matrix& A, double increase);
Matrix(double x);
int GetRows();
int GetCols();
static Matrix ConvertToMatrix(double x);
void InitiliazeMatrix(std::ifstream& f);
double ConvertToDouble();
void ShowMatrix();
double* operator[](int index);
friend Matrix operator+(Matrix& A, Matrix& B);
friend Matrix operator-(Matrix& A, Matrix& B);
friend Matrix operator*(Matrix& A, Matrix& B);
const Matrix operator=(const Matrix& A);
friend Matrix operator+=(Matrix& A, double a);
friend bool operator<=(Matrix& A, Matrix& B);
friend bool operator>=(Matrix& A, Matrix& B);
~Matrix();
};
Файл с реализацией
Код:
#include "Matrix.h"
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
Matrix::Matrix(int rows_0 = 0, int cols_0 = 0)
{
matrix = (double**) new double* [rows_0];
for (int i = 0; i < rows_0; i++)
{
matrix[i] = (double*) new double[cols_0];
}
rows = rows_0;
cols = cols_0;
}
Matrix::Matrix(Matrix& A, double increase = 0.0)
{
if (A.GetCols() != 0 && A.GetRows() != 0)
{
matrix = (double**) new double* [A.rows];
for (int i = 0; i < A.rows; i++)
{
matrix[i] = (double*) new double[A.cols];
}
for (int i = 0; i < A.rows; i++)
{
for (int j = 0; j < A.cols; j++)
{
matrix[i][j] = A.matrix[i][j] + increase;
}
}
rows = A.rows;
cols = A.cols;
}
}
Matrix::Matrix(double x)
{
matrix = (double**)new double* [1];
matrix[0] = (double*)new double [1];
matrix[0][0] = x;
rows = 1;
cols = 1;
}
int Matrix::GetRows()
{
return (*this).rows;
}
int Matrix::GetCols()
{
return (*this).cols;
}
Matrix Matrix::ConvertToMatrix(double x)
{
return Matrix(x);
}
void Matrix::InitiliazeMatrix(ifstream& f)
{
for (int i = 0; i < (*this).rows; i++)
{
for (int j = 0; j < (*this).cols; j++)
{
f >> (*this).matrix[i][j];
}
}
}
double Matrix::ConvertToDouble()
{
double s = 0.0;
for (int i = 0; i < (*this).rows; i++)
{
for (int j = 0; j < (*this).cols; j++)
{
s += (*this).matrix[i][j];
}
}
double size = static_cast<double>((*this).rows) * static_cast<double>((*this).cols);
return s / size;
}
void Matrix::ShowMatrix()
{
for (int i = 0; i < (*this).rows; i++)
{
for (int j = 0; j < (*this).cols; j++)
{
cout << (*this).matrix[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
double* Matrix::operator[](int index)
{
int max_index = (*this).rows > (*this).cols ? (*this).rows - 1 : (*this).cols - 1;
if (index < 0 || index > max_index)
{
cout << "Индекс вне границ." << endl;
return nullptr;
}
return (*this).matrix[index];
}
const Matrix Matrix::operator=(const Matrix& A)
{
if (&A != nullptr)
{
if ((*this).rows == A.rows && (*this).cols == A.cols)
{
for (int i = 0; i < (*this).rows; i++)
{
for (int j = 0; j < (*this).cols; j++)
{
(*this).matrix[i][j] = A.matrix[i][j];
}
}
}
}
return *this;
}
Matrix operator+(Matrix& A, Matrix& B)
{
if (A.rows == B.rows && A.cols == B.cols)
{
Matrix W(A);
for (int i = 0; i < W.rows; i++)
{
for (int j = 0; j < W.cols; j++)
{
W.matrix[i][j] += B.matrix[i][j];
}
}
return Matrix(W);
}
else
{
cout << "Размеры матриц не удовлетворяют сложению." << endl;
exit(1);
}
}
Matrix operator-(Matrix& A, Matrix& B)
{
if (A.rows == B.rows && A.cols == B.cols)
{
Matrix W(A);
for (int i = 0; i < W.rows; i++)
{
for (int j = 0; j < W.cols; j++)
{
W.matrix[i][j] -= B.matrix[i][j];
}
}
return Matrix(W);
}
else
{
cout << "Размеры матриц не удовлетворяют вычитанию." << endl;
exit(1);
}
}
Matrix operator*(Matrix& A, Matrix& B)
{
if (A.cols == B.rows)
{
Matrix W(A.rows, B.cols);
double mult = 0.0;
for (int i = 0; i < A.rows; i++)
{
for (int j = 0; j < B.cols; j++)
{
for (int k = 0; k < A.cols; k++)
{
mult += (A.matrix[i][k] * B.matrix[k][j]); // Определение умножения матриц из линейой алгебры
}
W.matrix[i][j] = mult;
mult = 0.0;
}
}
return Matrix(W);
}
else
{
cout << "Размер матриц не подходит для их перемножения." << endl;
exit(1);
}
}
Matrix operator+=(Matrix& A, double a)
{
if (&A != nullptr)
{
Matrix W(A);
for (int i = 0; i < W.rows; i++)
{
for (int j = 0; j < W.cols; j++)
{
W.matrix[i][j] += a;
}
}
return(W);
}
return Matrix();
}
bool operator<=(Matrix& A, Matrix& B)
{
if (A.rows == B.rows && A.cols == B.cols)
{
for (int i = 0; i < A.rows; i++)
{
for (int j = 0; j < B.cols; j++)
{
if (A.matrix[i][j] > B.matrix[i][j])
{
return false;
}
}
}
}
return true;
}
bool operator>=(Matrix& A, Matrix& B)
{
if (A.rows == B.rows && A.cols == B.cols)
{
for (int i = 0; i < A.rows; i++)
{
for (int j = 0; j < B.cols; j++)
{
if (A.matrix[i][j] < B.matrix[i][j])
{
return false;
}
}
}
}
return true;
}
Matrix::~Matrix()
{
if ((*this).cols > 0)
{
for (int i = 0; i < (*this).rows; i++) { delete[](*this).matrix[i]; }
}
if ((*this).rows > 0) { delete[](*this).matrix; }
}
Проблема возникает в том, что не работает "+=", то есть прибавление double-числа ко всем элементам матрицы. В добавок, когда деструктор начинает удалять матрицы, то вызывается исключение. Помогите, пожалуйста.