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

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

Восстановить пароль Регистрация
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
13.01.2014, 23:11     Класс для двумерного динамического массива #1
Вот написал код для двумерного динамического массива с перегруженым оператором= и +.
Собственно код работает в 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++ Описать класс для реализации двумерного массива
Использование двумерного динамического массива C++
Класс динамического массива для различных типов C++
C++ Создание двумерного динамического массива
C++ Создание динамического двумерного массива
C++ Использование динамического двумерного массива
Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?) C++
Cоздание двумерного динамического массива C++
Сортировка двумерного динамического массива C++
Создать класс для реализации динамического массива C++
Заполнение двумерного динамического массива C++
Копия двумерного динамического массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
13.01.2014, 23:25     Класс для двумерного динамического массива #2
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
newb_programmer
 Аватар для newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 553
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
Сообщений: 99
13.01.2014, 23:52  [ТС]     Класс для двумерного динамического массива #4
newb_programmer, это я знаю. Просто для себя сделал такое сложение
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,102
14.01.2014, 00:29     Класс для двумерного динамического массива #5
А какой будет результат, если
C++
1
2
dinamic_matrix m3(matrix);
m3.PrintMatrix();
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
14.01.2014, 21:30  [ТС]     Класс для двумерного динамического массива #6
egor2116, нужно перегрузить конструктор типа
C++
1
Dinamic_matrix (Dinamic_matrix m);
???
Yandex
Объявления
14.01.2014, 21:30     Класс для двумерного динамического массива
Ответ Создать тему
Опции темы

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