Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Lazariev_V
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 55
1

Реализовать пользовательский класс Matrix (найти причины возникновения ошибок в коде и исправить эти ошибки)

08.10.2016, 23:29. Просмотров 787. Ответов 3
Метки нет (Все метки)

Доброго времени суток,задание написать класс Matrix,все вроде бы понятно,но почему-то моя матрица инициализируется мусором,не знаю почему,и когда я использую операторы + и += ,то вылетает debug ошибка,я думаю это из-за неправильной инициализации,просто не могу понять почему,как на мой взгляд ошибок не должно быть,но все же , они появились. Можете сказать в чем проблема и объяснить ошибку?
Заранее благодарен.

Код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma once
class Matrix
{
private:
    int cols;
    int rows;
    int **matrix;
public:
    Matrix();
    Matrix(int rows,int cols);
    Matrix(Matrix &matrix);
    ~Matrix();
 
    
    int getRows();
    int getCols();
 
    friend ostream& operator<<(ostream& os, Matrix &matrix);
    friend istream& operator >> (istream& is, Matrix &matrix);
 
 
 
    //int& operator[](int i,int j);
    Matrix operator=(Matrix &matrix);
    Matrix operator+(Matrix &matrix);
    Matrix operator+=(Matrix &matrix);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "stdafx.h"
#include "Matrix.h"
 
 
Matrix::Matrix()
{
    cols = 0;
    rows = 0;
    matrix = new int *[rows];
    for (int i = 0; i < rows; i++)
    {
        matrix[i] = new int[cols];
    }
    for (int a = 0; a < rows; a++)
    {
        for (int b = 0; b < cols; b++)
        {
            matrix[a][b] = 0;
        }
    }
}
Matrix::Matrix(int rows, int cols)
{
    matrix = new int*[rows];
    for (int i = 0; i < rows; i++)
    {
        matrix[i] = new int[cols];
    }
 
}
Matrix::Matrix(Matrix &matrix)
{
    this->matrix = new int*[rows];
    for (int i = 0; i < rows; i++)
    {
        this->matrix[i] = new int[cols];
    }
 
    for (int a = 0; a < rows; a++)
    {
        for (int b = 0; b < cols; b++)
        {
            this->matrix[a][b] = matrix.matrix[a][b];
        }
    }
}
Matrix::~Matrix()
{
    if (matrix != nullptr)
    {
        delete[] matrix;
    }
}
 
int Matrix::getRows()
{
    return rows;
}
 
int Matrix::getCols()
{
    return cols;
}
 
Matrix Matrix::operator=(Matrix & matrix)
{
    this->rows = matrix.rows;
    this->cols = matrix.cols;
    this->matrix = matrix.matrix;
    return *this;
}
ostream & operator<<(ostream & os, Matrix & matrix)
{
    for (int i = 0; i < matrix.cols; i++)
    {
        for (int j = 0; j < matrix.rows; j++)
        {
            os << matrix.matrix[i][j];
        }
        cout << endl;
    }
    cout << endl;
    return os;
}
 
istream & operator >> (istream & is, Matrix & matrix)
{
    for (int i = 0; i < matrix.cols; i++)
    {
        for (int j = 0; j < matrix.rows; j++)
        {
            is >> matrix.matrix[i][j];
        }
        cout << endl;
    }
    cout << endl;
    return is;
}
 
Matrix Matrix::operator+(Matrix & matrix)
{
    Matrix result(getRows(),getCols());
    if (this-> rows != matrix.rows || this-> cols != matrix.cols )
    {
        cout << "ERROR,arrays are different";
        exit(0);
    }
 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            result.matrix[i][j] = this->matrix[i][j] + matrix.matrix[i][j];
        }
    }
    return result;
}
Matrix Matrix::operator+=(Matrix & matrix)
{
    if (this->rows != matrix.rows || this->cols != matrix.cols)
    {
        cout << "ERROR,arrays are different";
        exit(0);
    }
 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            this->matrix[i][j] += matrix.matrix[i][j];
        }
    }
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
 
 
int main()
{
    Matrix matrix(5,5),matrix2(5,5),matrix3;
    matrix3 = matrix;
    cout << matrix3;
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2016, 23:29
Ответы с готовыми решениями:

Найти причины возникновения ошибок в коде и исправить эти ошибки
Совсем я запуталась. Опять куча ошибок. Помогите разобраться, пжлст. П.5.18.Правил Запрещено...

Найти причины возникновения ошибок в коде и исправить эти ошибки
не пойму что он от меня хочет #include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream.h&gt;...

Найти причины возникновения ошибок в коде и исправить эти ошибки
void cvedenmagaz(string cveden, tovar* tov, basa univermag, basa product){ string magas; ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Всем хай. Во-первых, vs не видит в мейне V и говорит, что она не инициализирована, но на идеоне оно...

Найти причины возникновения ошибок в коде и исправить эти ошибки
// Висимских.cpp : Defines the entry point for the console application. #include &quot;stdafx.h&quot;...

3
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 510
Завершенные тесты: 2
09.10.2016, 00:39 2
Лучший ответ Сообщение было отмечено Lazariev_V как решение

Решение

Конструктор инициализации тут неполный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Matrix::Matrix(int rows, int cols)
{
    this->cols  = cols;     // надо бы запоминать сколько у нас строк-столбцов
    this->rows = rows;   //
 
    matrix = new int*[rows];
    for (int i = 0; i < rows; i++)
    {
        matrix[i] = new int[cols];
    }
    
    // инициализацию тоже бы добавить
    for (int a = 0; a < rows; a++)
    {
        for (int b = 0; b < cols; b++)
            matrix[a][b] = 0;
    } 
}
Оператор присвоения вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Matrix& Matrix::operator=(Matrix & matrix) // возвращаем ссылку на *this
{
        // подчищаем старую память
    for(int i = 0; i < this->rows; ++i)
        delete [] this->matrix[i];
    delete [] this->matrix;      
 
    this->rows = matrix.rows;
    this->cols = matrix.cols;
 
        // выделяем память под новую матрицу
    this->matrix = new int*[matrix.rows];
    for(int i = 0; i < matrix.rows; ++i)
        this->matrix[i] = new int[matrix.cols];
 
        // заполняем новую матрицу данными исходной матрицы
    for(int a = 0; a < matrix.rows; ++a)
        for(int b = 0; b < matrix.cols; ++b)
            this->matrix[a][b] = matrix.matrix[a][b];
 
    return *this;
}
Ваш деструктор чистит не все. Сколько раз сделали new, столько раз делаем и delete
C++
1
2
3
4
5
6
7
Matrix::~Matrix()
{
    for(int i = 0; i < rows; ++i)
        delete [] matrix[i];
    delete [] matrix;
 
}
Остальное не смотрел, но прога уже живет)
1
sourcerer
Модератор
Эксперт CЭксперт С++
4901 / 2087 / 326
Регистрация: 20.02.2013
Сообщений: 5,571
Записей в блоге: 24
Завершенные тесты: 1
09.10.2016, 01:23 3
Lazariev_V, можете вот тут, например, посмотреть.
0
Lazariev_V
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 55
09.10.2016, 15:09  [ТС] 4
Selot
Спасибо,очень помог!
Я думал на стену залезу пока додумаюсь)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2016, 15:09

Найти причины возникновения ошибок в коде и исправить эти ошибки
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Всем привет, я новичок. Решил попробовать создать простенький класс который выводит данные которые...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Уважаемые форумчане, тут вот изучал дружественные методы, классы и функции и наткнулся вот на токую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru