Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
vozup
7 / 7 / 2
Регистрация: 25.12.2011
Сообщений: 103
#1

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

13.01.2014, 23:11. Просмотров 422. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 23:11
Ответы с готовыми решениями:

Метод-член класса для создания одномерного массива из отрицательных элементов двумерного динамического массива
Помогите, пожалуйста, нужно разработать метод-член класса для создания одномерного массива из...

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include &lt;iostream&gt; void allocateMemory(int ***array, int size); void...

Написать программу для транспонирования матрицы, реализованной в виде двумерного динамического массива
написать программу для транспонирования матрицы,реализованной в виде двумерного динамического...

Создать класс для реализации динамического массива
Доброго времени суток! Помогите создать класс который реализует динамический массив(с динамическим...

Класс динамического массива для различных типов
Можно ли создать класс динамического массива, чтоб при создании массива можно было бы задать размер...

5
AnDrew_LP
161 / 161 / 42
Регистрация: 29.05.2010
Сообщений: 435
13.01.2014, 23:25 #2
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
1
newb_programmer
237 / 237 / 113
Регистрация: 03.09.2011
Сообщений: 558
13.01.2014, 23:40 #3
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
C++
1
       //delete [] matrix; так компилятор ругается
Почему ругается? Не должен. Все правильно будет, если добавить эту строку
Не ругается

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

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

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

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

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?)
Привет, народ, есть такое задание: 2. написать класс для динамического массива с проверкой...

Копия двумерного динамического массива
Как создать копию двумерного динамического массива? Имеется двумерный динамический массив. Нужно...


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

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

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