Перегрузка операции ++ для класса матриц в C++

279
01 декабря 2017, 06:11

Я создал класс матриц и перегрузил для него операцию ++ (прибавление к матрице единичной матрицы), но почему то программа не работает, при запуске выдаёт ошибку detected before normal block... Если убрать операцию ++, то всё работает.

В чём ошибка и как её исправить? UPD. Ошибки исправил, всё работает.

#include<iostream>
#include<iomanip>
#include<fstream>
using namespace std;
class Matrix
{   
    int *matrix;
    int n;
    public:
    Matrix(int);
    Matrix()
    {
        matrix = NULL;
    }
    int &operator()(int i, int j)
    {
        return matrix[i *n + j];
    }
    friend ostream &operator<< (ostream &s, const Matrix &c); // перегруженный оператор вывода
    friend istream &operator >> (istream &s, Matrix &c); // перегруженный оператор ввода
    ~Matrix() // десструктор класса Matrix
    {
        delete[] matrix;
    }
    friend Matrix& operator++(Matrix&);//оператор ++
    friend Matrix& operator++(Matrix&, int);
    Matrix &operator=(Matrix &c);
};
Matrix::Matrix(int an) // конструктор с параметрами
{
    n = an;
    matrix = new int[n*n];
}
Matrix &Matrix::operator=(Matrix &c)
{
    for (int i = 0; i < c.n; i++)
    {
        for (int j = 0; j < c.n; j++)
        {
            this->matrix[i *( this->n) + j] = c.matrix[i * c.n + j];
        }
    }
    return *this;
}
istream& operator >> (istream &s, Matrix &c)//ВВОД
{
    for (int i = 0; i<c.n; i++)
    {
        for (int j = 0; j<c.n; j++)
        {
            s >> c.matrix[i*c.n + j];   
        }
    }
    return s;
}
ostream &operator<< (ostream &s, const Matrix &c)//ВЫВОД
{
    for (int i = 0; i<c.n; i++)
    {
        for (int j = 0; j<c.n; j++)
        {
            s << setw(5) << c.matrix[i * c.n + j];
        }
        s<<'\n';
    }
    return s;
}
Matrix& operator++( Matrix&c) //ОПЕРАЦИЯ ++M
{
    for (int i = 0; i < c.n; i++)
        c.matrix[i * c.n + i]++;
    return c;   
}
Matrix& operator++(Matrix&c, int) //ОПЕРАЦИЯ M++
{
    Matrix Y(c.n);
    Y = c;
    for (int i = 0; i < c.n; i++)
        c.matrix[i * c.n + i]++;
    return Y;
}
void main()
{
    setlocale(LC_ALL, "");
    int n;
    cout <<"Введите размер матрицы:"<<'\n';
    cin >> n;
    Matrix A(n);
    cout << "Введите элементы матрицы:" << '\n';
    cin >> A;
    cout << "Матрица:" << '\n';
    cout << A << '\n';;
    Matrix Z(n);
    Z = A;
    cout << "Копия матрицы:" << '\n';
    cout << Z << '\n';;
    cout << "++Матрица:" << '\n';
    cout << (Z = ++A) << '\n';;
    cout << "Матрица++:" << '\n';
    cout << (Z = A++) << '\n';;
    system("pause");
}
Answer 1

У вас странное обращение к элементам матрицы.

Вместо:

for (int i = 0; i<k; i++)
{
    this->matrix[(i - 1)*k + i - 1]++;
}

Попробуйте:

for (int i = 0; i < k; i++)
{
     for (int j = 0; j < k; j++)
     {
        if ( i == j ) { this->matrix[ i * k + j ]++; }
     }
}

Тоже самое касается всех ваших обращений к элементам матрицы во всех остальных операторах.

READ ALSO
Как создаётся файл .AVI и/или .MJPG из jpeg-кадров на С++?

Как создаётся файл .AVI и/или .MJPG из jpeg-кадров на С++?

В программе на C++ идёт непрерывный поток кадров в формате jpeg (снимает вебкамера)Кадры на диск не попадают, всё в буфере

260
C++ недопустимое количество параметров в команде xcopy

C++ недопустимое количество параметров в команде xcopy

Думаю, вы не учли, что обратный слеш внутри строковых литералов имеет особое значениеЛибо заэкранируйте их:

370
Как &ldquo;рисовать&rdquo; в командной строке windows?

Как “рисовать” в командной строке windows?

В линуксе консольные приложения часто выводят свой прогресс подобием такого: [####___] 50%, при этом надпись "обновляется" на том же месте в терминале,...

283
C++/QT выполнения функций в отдельном файле

C++/QT выполнения функций в отдельном файле

В maincpp имеется функция с телом

201