Класс Матрица С++

220
10 марта 2018, 19:42

Только начинаю изучать ООП, написал класс для матриц и перегрузил операторы ввода, вывода, +, -, =. Программа работает до момента с сложением матриц, а потом аварийно завершается, не могу найти ошибку, помогите пожалуйста.
Вот код:

#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;
}
Answer 1
Matrix()
{
    int m = 0;
    int n = 0;
    int arr = 0;
}

Заметим, что вы обнуляете какие-то локальные переменные, а не члены класса.

Но главное - у вас нет копирующего конструктора, а генерируемый по умолчанию выполняет поверхностное копирование. Не скажу, что это все неприятности, но этого уже достаточно...

Answer 2

Попробуй так

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 укзателю и из-за этого программа падает. Сделай проверку при удалении

READ ALSO
vector subscript out of range c чем это связано?

vector subscript out of range c чем это связано?

Ребят помогите с чем связана такая ошибка? Почему выходит за рэнджЗаметил во многих программах моих появляется когда использую большие числа

224
Функция как параметр для другой функции

Функция как параметр для другой функции

Требуется вызвать функции с различными типами данных (void, double, int) в другой функцииПример: Есть функции:

232
В вектор записывается не вся информация

В вектор записывается не вся информация

Почему когда я выписываю названия городов, выписывается лишь последнее записанное значение?

213
Сортировка пользовательского класса в QVector

Сортировка пользовательского класса в QVector

Как сделать сортировку вектора моего класса QVector <DbTrade>?

214