Только начинаю изучать ООП, написал класс для матриц и перегрузил операторы ввода, вывода, +, -, =. Программа работает до момента с сложением матриц, а потом аварийно завершается, не могу найти ошибку, помогите пожалуйста.
Вот код:
#include <iostream>
#include <conio.h>
using namespace std;
class Matrix
{
private:
int m;
int n;
int** arr;
public:
void Del()
{
for (int z = 0; z < m; z++)
delete[] arr[z];
delete[] arr;
}
void Create()
{
arr = new int* [m];
for (int z = 0; z < m; z++)
arr[z] = new int[n];
}
void Set_Elems()
{
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> arr[i][j];
}
void Display()
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int Get_m()
{
return m;
};
int Get_n()
{
return n;
};
Matrix()
{
int m = 0;
int n = 0;
int arr = 0;
}
Matrix(int m, int n)
{
this->m = m;
this->n = n;
Create();
}
//Копирование матриц;
void matrix_copy(const Matrix& b)
{
Del();
Create();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
arr[i][j] = b.arr[i][j];
}
friend Matrix operator + (Matrix& a, Matrix& b)
{
int m1 = a.Get_m();
int n1 = b.Get_n();
Matrix temp(m1, n1);
for (int i = 0; i < m1; i++)
{
for (int j = 0; j < n1; j++)
{
temp.arr[i][j] = a.arr[i][j] + b.arr[i][j];
}
}
return temp;
}
friend Matrix operator - (Matrix& a, Matrix& b)
{
int m1 = a.Get_m();
int n1 = b.Get_n();
Matrix temp(m1, n1);
for (int i = 0; i < m1; i++)
{
for (int j = 0; j < n1; j++)
{
temp.arr[i][j] = a.arr[i][j] - b.arr[i][j];
}
}
return temp;
}
Matrix operator = (const Matrix& b)
{
matrix_copy(b);
return *this;
}
~Matrix()
{
for (int z = 0; z < m; z++)
delete[] arr[z];
delete[] arr;
}
};
ostream& operator <<(ostream& ostr, Matrix& m)
{
m.Display();
return (ostr);
}
istream& operator >>(istream& in, Matrix& m)
{
m.Set_Elems();
return (in);
}
int main()
{
Matrix a(2, 2);
cout << "Input Matrix a" << endl;
cin >> a;
cout << "Matrix a =:" << endl;
cout << a;
Matrix b(2, 2);
cout << "Input Matrix b" << endl;
cin >> b;
cout << "Matrix b =" << endl << b << endl;
int m1 = a.Get_m();
int n1 = b.Get_n();
Matrix c(m1, n1);
c = a; // Вот здесь программа завершается
cout << "c = a:" << c;
c = (a + b);
cout << "c = a + b" << c;
_getch();
return 0;
}
Matrix()
{
int m = 0;
int n = 0;
int arr = 0;
}
Заметим, что вы обнуляете какие-то локальные переменные, а не члены класса.
Но главное - у вас нет копирующего конструктора, а генерируемый по умолчанию выполняет поверхностное копирование. Не скажу, что это все неприятности, но этого уже достаточно...
Попробуй так
template<typename T>
class Matrix {
private:
std::size_t m_iN = 0;
std::size_t m_iM = 0;
T* m_pData = nullptr;
public:
Matrix(std::size_t N, std::size_t M) {
assert((N > 0) && (N > 0));
m_pData = new T[M * N];
}
Matrix(Matrix& const m) {
m_iN = m.m_iN;
m_iM = m.m_iM;
m_pData = new T[m_iM * m_iN];
std::memcpy(m_pData, m.m_pData, m_iM * m_iN * sizeof(T));
}
Matrix& operator =(Matrix& const m) {
if (m_pData == m.m_pData)
return *this;
if (m_pData != nullptr)
delegate[] m_pData;
this(m);
return *this;
}
~Matrix() {
if (m_pData != nullptr)
delete[] m_pData;
}
auto operator()(std::size_t i, std::size_t j) const noexcept->T {
assert((i < m_iN) && (j < m_iM));
return m_pData[i*m_iN + m_iM];
};
auto operator()(std::size_t i, std::size_t j) const noexcept->T& {
return m_pData[i*m_iN + m_iM];
}
};
В твоем случае наверняка ты где-то удаляешь по NULL укзателю и из-за этого программа падает. Сделай проверку при удалении
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Ребят помогите с чем связана такая ошибка? Почему выходит за рэнджЗаметил во многих программах моих появляется когда использую большие числа
Требуется вызвать функции с различными типами данных (void, double, int) в другой функцииПример: Есть функции:
Почему когда я выписываю названия городов, выписывается лишь последнее записанное значение?
Как сделать сортировку вектора моего класса QVector <DbTrade>?