Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
#1

Класс для двумерного динамического массива - C++

13.01.2014, 23:11. Просмотров 352. Ответов 5
Метки нет (Все метки)

Вот написал код для двумерного динамического массива с перегруженым оператором= и +.
Собственно код работает в MS VS 2010, но меня смущает правильность выделения и освобождения памяти, а также конструктор копирования. За написания кода сильно не ругайте)
Профессионалы подскажите что не так, что не хватает.
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class Dinamic_matrix
{
private:
    int **matrix;
    int m;
    int n;
    bool isZero;//выделена ли память для матрици?
public:
    //Конструкторы, деструкторы
    Dinamic_matrix(int x = 3){
        if(x == 0)
        {
            m = n = 0;
            isZero = true;
        }
        else
        {
            m = n = x;
            matrix = new int* [m];
 
            for(int i=0;i<m;i++)
                matrix[i] = new int [n]();// Обнуляется каждая строка в процессе создания
 
            isZero = false;
        }
 
    }
    Dinamic_matrix(int m, int n)
    {
        this->m = m;
        this->n = n;
        isZero = false;
 
        matrix = new int* [m];
 
        for(int i=0;i<m;i++)
            matrix[i] = new int [n]();// Обнуляется каждая строка в процессе создания
    }
    Dinamic_matrix (const Dinamic_matrix &copy){
        this->m = copy.m;
        this->n = copy.n;
        this->isZero = copy.isZero;
 
        matrix = new int* [m];
 
        for(int i=0;i<m;i++)
            matrix[i] = new int [n];
    
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                matrix[i][j] = copy.matrix[i][j];
            }
    }
    ~Dinamic_matrix(){
        for(int i=0;i<m;i++)
            delete [] matrix[i];
        //delete [] matrix; так компилятор ругается
    }
    //Методы класса
    void PrintMatrix(); //Вывод матрици
    int SetMatrix();    //Заполнение матрици
    //Перегруженые операторы
    Dinamic_matrix operator+(const Dinamic_matrix &plus)
    {
        if(this->n == plus.n && this->m == plus.m)//если размеры матриц совпадают
        {
            Dinamic_matrix tmp(this->m,this->n);
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    tmp.matrix[i][j] = this->matrix[i][j] + plus.matrix[i][j];
            return tmp;
        }
 
        else
        if(plus.isZero)//если прибавляем к пустой матрице
        {
            return *this;
        }
 
        else            //если прибавляем пустую матрицу
            if(this->isZero) return plus;
 
        else            //если размеры не совпадают
        {
            Dinamic_matrix rezult(max(this->m,plus.m),max(this->n,plus.n));//создаем матрицу с наибольшими полями из обеих матриц
            int res = 0;
            //****Пример прибавления матриц********
            //  1 2 3       1 2      2 4 3
            //  4 5 6   +   3 4   =  7 9 6 
            //  1 2 3       5 6      6 8 3 
            //              7 8      7 8 0
            //*************************************
 
            for(int i=0;i<rezult.m;i++)
                for(int j=0;j<rezult.n;j++)
                {
                    if(i < this->m && j < this->n)
                    {
                        res = matrix[i][j];
                        if(i < plus.m && j < plus.n)
                            res += plus.matrix[i][j];
                    }
                    else
                    {
                        if(i < plus.m && j < plus.n)
                            res = plus.matrix[i][j];
                        else res = 0;
                    }
                    rezult.matrix[i][j] = res;
                }
            return rezult;
        }
    }
    //**********
    Dinamic_matrix operator=(const Dinamic_matrix &assign)
    {
        if(this == &assign)
            return *this;
 
        if(this->isZero)//если присваиваем пустой матрице
        {
            this->m = assign.m;
            this->n = assign.n;
            this->isZero = false;
 
            matrix = new int* [m];//резервируем новую память
 
            for(int i=0;i<m;i++)
                matrix[i] = new int [n]();
 
 
            for(int i=0;i<this->m;i++)
                for(int j=0;j<this->n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
            
            return *this;
        }
 
        else
        if(this->m == assign.m && this->n == assign.n)//если размеры матриц совпадают
        {
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
            return *this;
        }
 
        else                            //если размеры матриц не совпадают
        {
            for(int i=0;i<this->m;i++)    //освобождаем старую память
                delete [] this->matrix[i];
 
            this->m = assign.m;
            this->n = assign.n;
 
            this->matrix = new int* [m];//резервируем новую память
            for(int i=0;i<m;i++)
                this->matrix[i] = new int [n]();
 
            for(int i=0;i<m;i++)        //присваиваем значения новой матрице
                for(int j=0;j<n;j++)
                    this->matrix[i][j] = assign.matrix[i][j];
 
            return *this;
        }
    }
};
 
void Dinamic_matrix::PrintMatrix()
{
    if(isZero) cout<<"Error! Check your array!\n";
    else
    {
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
                cout<<matrix[i][j]<<" ";
        cout<<endl;
        }
        cout<<endl;
    }
}
 
int Dinamic_matrix::SetMatrix()
{
    if(isZero) 
    {
            cout<<"You cant set zero matrix!\n"; 
            return 1;
    }
    else
    {
        int c=1;
        cout<<"Enter element of matrix "<<m<<" x "<<n<<endl;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                cout<<"Element "<<c<<": ";
                cin>>matrix[i][j];
                c++;
            }
            return 0;
    }
}
 
 
int main()
{
    Dinamic_matrix matrix(3,3), matrix2(4,2), result(2,2);
    matrix.SetMatrix();
    matrix2.SetMatrix();
    result = matrix2 + matrix;
    matrix.PrintMatrix();
    matrix2.PrintMatrix();
    result.PrintMatrix();
 
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 23:11     Класс для двумерного динамического массива
Посмотрите здесь:

Описать класс для реализации двумерного массива - C++
Хочу сделать класс, который будет описывать поле размером 5х3. Для этого использую вложенные друг в друга векторы. Но при реализации...

Поворот динамического двумерного массива - C++
Доброго времени суток. Столкнулся с такой проблемой что не могу развернуть динамический двумерный массив. Результат выводит плачевный: ...

Сортировка двумерного динамического массива - C++
Уважаемые форумчане, при сортировке и выводе отсортированного массива в первой строке вместо нормальных значений выводит мусор, ковыряюсь в...

Ошибка заполнения динамического двумерного массива - C++
При заполнении массива mas происходит выход за границы массива. По ходу исполнения программы данные записываются в ячейки и т.д. Судя по...

Сравнение элементов двумерного динамического массива - C++
Для работы программы мне нужно сравнивать элементы двумерного динамического массива, массив создан в главной функции, сравниваю в побочной,...

Проблемма с заполнением динамического двумерного массива - C++
По заданию,нужно: -объявить двумерный динамический массив -спросить и пользователя размеры массива -выделить память -заполнить...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
13.01.2014, 23:25     Класс для двумерного динамического массива #2
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
13.01.2014, 23:40     Класс для двумерного динамического массива #3
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
Не ругается

Добавлено через 2 минуты
vozup, хз что вы там в плюсе определяете но википедия подсказывает
Сложение матриц[править | править исходный текст]

Складывать можно только матрицы одинакового размера.

Сложение матриц A+B есть операция нахождения матрицы C , все элементы которой равны попарной сумме всех соответствующих элементов матриц A и B, то есть каждый элемент матрицы C равен
Cij=Aij+Bij;
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
13.01.2014, 23:52  [ТС]     Класс для двумерного динамического массива #4
newb_programmer, это я знаю. Просто для себя сделал такое сложение
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
14.01.2014, 00:29     Класс для двумерного динамического массива #5
А какой будет результат, если
C++
1
2
dinamic_matrix m3(matrix);
m3.PrintMatrix();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 21:30     Класс для двумерного динамического массива
Еще ссылки по теме:

Освобождение динамического двумерного массива указателей - C++
Доброго времени суток. Подскажите как правильно очистить память после вот такого выделения: MyClass _class = new MyClass **; ...

Реализовать сортировку двумерного динамического массива - C++
#include &quot;stdafx.h&quot; #include &lt;ctime&gt; #include &quot;stdafx.h&quot; #include &lt;ctime&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using...

Ошибка описания динамического двумерного массива - C++
#include &lt;iostream&gt; using namespace std; int main() { int x, y, i, j; cout &lt;&lt; &quot;Введите кол-во строк и столбцов: &quot;; ...

Передача динамического двумерного массива в процедуру - C++
Написал вот такой код для одномерного динамического массива #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
14.01.2014, 21:30  [ТС]     Класс для двумерного динамического массива #6
egor2116, нужно перегрузить конструктор типа
C++
1
Dinamic_matrix (Dinamic_matrix m);
???
Yandex
Объявления
14.01.2014, 21:30     Класс для двумерного динамического массива
Ответ Создать тему
Опции темы

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