0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
1

Класс, конструктор, деструктор и прочее

26.04.2018, 17:01. Показов 1468. Ответов 8

Добрый день.
Есть задание:

Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является объектом класса. Память под матрицу должна выделяться динамически (с помощью new). Должны быть определены деструктор и следующие конструкторы:
· Конструктор по умолчанию создает матрицу с размером по умолчанию;
· Копирующий конструктор.
Необходимо перегрузить операции вычитания и смены знака (-) (операции должны выполняться поэлементно с элементами каждой матрицы) и операцию присваивания.

Выполнил задание вот таким образом:
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
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
 
#include <Windows.h>
#include <iomanip>
 
using namespace std;
 
class Matrix
{
private:
 
    int n, m;
    double **A;
 
public:
 
    //Конструктор по умолчанию;
    Matrix()
    {
        //Матрица с размером по умолчанию
        n = 3; m = 5;
 
        //Выделение памяти (с помощью new)
        A = new double *[n];
        for (int i = 0; i < n; i++)
            A[i] = new double[m];
        
        //Обнуляем матрицу
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                A[i][j] = 0;
            }
        }
        cout << this << endl;//
    }
 
    //Заполнение матрицы
    void setMatrix()
    {   
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                A[i][j] = (double)(rand() % 2001) / 100 - 10;
            }
        }
    }
 
    //Вывод матрицы
    void getMatrix()
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << setw(7) << A[i][j];
            } cout << endl;
        } cout << endl;
    }
 
    //Конструктор копирования
    Matrix (const Matrix &ob) 
    {
        cout << "\nКопирующий конструктор\n";
        n = ob.n; m = ob.m;
        A = new double*[n];
        for (int i = 0; i < n; i++)
            A[i] = new double[m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = ob.A[i][j];
 
        cout << this << endl;
    }
 
    //Дестркуктор
    ~Matrix()
    {
        cout << "\nДестркуктор\n"; cout << this << endl;
        for (int i = 0; i<n; i++)
            delete[] A[i];
        delete[] A;
    }
 
    //---------------------------------------------------------------------------
    
 
    //Перегрузка оператора присваивания
    Matrix& operator=(const Matrix& ob)
    {
        if (n != ob.n || m != ob.m)
        {
            // освобождение памяти в левом операнде
            for (int i = 0; i < n; i++)
                delete[] A[i];
            delete[] A;
            // выделение памяти в левом операнде
            n = ob.n; m = ob.m;
            A = new double*[n];
            for (int i = 0; i < n; i++)
                A[i] = new double[m];
        }
        //Копирование данных правого операнда в левый
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = ob.A[i][j];
        return *this;
    }
    
    //Перегрузка оператора вычитания
    Matrix operator-(const Matrix &ob)
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = A[i][j] - ob.A[i][j];
        return *this;
    }
 
    //Перегрузка оператора вычитания
    friend Matrix operator-(Matrix &left, Matrix &right)
    {
        if (left.n != right.n || left.m != right.m)
            cout << "\nМатричные размеры не совпадают\n";
 
        Matrix result;
        for (int i = 0; i < left.n; i++)
            for (int j = 0; j < left.m; j++)
                result.A[i][j] = left.A[i][j] - right.A[i][j];
        return result;
    }
 
 
    //Перегрузка оператора смены знака
    Matrix operator-() const
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = -A[i][j];
        return *this;
    }
 
    
    //---------------------------------------------------------------------------
 
};
 
int main()
{
    srand((unsigned)time(NULL));
    setlocale(0, "");
 
    Matrix M1;
    Matrix M2;
    Matrix M3;
 
    //Матрицы M1
    M1.setMatrix(); //Заполнение матрицы M1
    cout << "Матрица М1 New\n";
    M1.getMatrix(); //Вывод матрицы M1
 
    //Матрицы M2
    M2.setMatrix(); //Заполнение матрицы M2
    cout << "Матрица М2 New\n";
    M2.getMatrix(); //Вывод матрицы M2
 
    //Матрицы M3
    cout << "Матрица М3 New\n";
    M3.getMatrix(); //Вывод матрицы M3 (Пустая)
 
    cout << "Присваивание\n";
    M3 = M1; M3.getMatrix(); M1.getMatrix();
 
    cout << "Вычитание\n";
    M3 = M3 - M2 - M1 - M3; M1.getMatrix(); M2.getMatrix(); M3.getMatrix();
    
    cout << endl;
    system("pause");
    return 0;
Прошу информации:
1. Не совсем понял задание и даже не понимаю, выполнил ли я требования или нет.
2. Запутался в операторах. Читал много про операторы, но в голове логики нет.
Не совсем понимаю где нужен const, а где нет. Запутался с указателями & - тоже не знаю где надо, а где нет.
3. Проблемы с оператором смены знака.
Допустим я пишу в код M3=-M2, он мне меняет М2 и присваивает к М3, и обе матрицы с отрицательным знаком.
Но мне нужно чтобы M2 не изменялся на постоянно а только временно, чтобы дать новые значения M3.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2018, 17:01
Ответы с готовыми решениями:

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

Класс: конструктор и деструктор
Возник вопрос. Если я в классе не делаюни одного данного с выделением динамической памяти, то как...

Добавить в класс конструктор и деструктор
Помогите пожалуйста добавить в класс конструктор и деструктор. Заранее спасибо ) #include...

Класс, конструктор, деструктор, дружественные функции
Нужна помощь с ООП. Вот задание: Общая постановка. Пользовательский класс Х должен содержать...

8
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
26.04.2018, 18:26 2
Вариант с friend убери. Вычитание и смена знака должны возвращать новый объект, а не this - как в варианте с friend.
1
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
26.04.2018, 20:04  [ТС] 3
Ошибка без friend "слишком много параметров для этой функции оператора". В общем бинарные (без friend) у меня выдают ошибку, а унарные нет.
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
26.04.2018, 20:17 4
Имеется в виду, что надо убрать всю функцию, а не только слово friend. Остальное исправил?
1
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
27.04.2018, 09:53  [ТС] 5
Если ее всю убрать, у меня остаётся унарная операция вычитания. Она не совсем правильно считает. Щас займусь исправлением. Если в вычитание понимаю как справиться, то смена знака не совсем доходит((

В общем щас займусь и скину что получилось, спасибо за помощь

Добавлено через 13 часов 12 минут
Добрый день, помогло.

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
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
 
#include <Windows.h>
#include <iomanip>
 
using namespace std;
 
class Matrix
{
private:
 
    int n, m;
    double **A;
 
public:
 
    //Конструктор по умолчанию;
    Matrix()
    {
        //Матрица с размером по умолчанию
        n = 3; m = 5;
 
        //Выделение памяти (с помощью new)
        A = new double *[n];
        for (int i = 0; i < n; i++)
            A[i] = new double[m];
        
        //Обнуляем матрицу
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                A[i][j] = 0;
            }
        }
        cout << this << endl;//
    }
 
    //Заполнение матрицы
    void setMatrix()
    {   
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                A[i][j] = (double)(rand() % 2001) / 100 - 10;
            }
        }
    }
 
    //Вывод матрицы
    void getMatrix()
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << setw(7) << A[i][j];
            } cout << endl;
        } cout << endl;
    }
 
    //Конструктор копирования
    Matrix (const Matrix &ob) 
    {
        cout << "\nКопирующий конструктор\n";
        n = ob.n; m = ob.m;
        A = new double*[n];
        for (int i = 0; i < n; i++)
            A[i] = new double[m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = ob.A[i][j];
 
        cout << this << endl;
    }
 
    //Дестркуктор
    ~Matrix()
    {
        cout << "\nДестркуктор\n"; cout << this << endl;
        for (int i = 0; i<n; i++)
            delete[] A[i];
        delete[] A;
    }
 
    //---------------------------------------------------------------------------
    
 
    //Перегрузка оператора присваивания
    Matrix& operator=(const Matrix& ob)
    {
        if (n != ob.n || m != ob.m)
        {
            // освобождение памяти в левом операнде
            for (int i = 0; i < n; i++)
                delete[] A[i];
            delete[] A;
            // выделение памяти в левом операнде
            n = ob.n; m = ob.m;
            A = new double*[n];
            for (int i = 0; i < n; i++)
                A[i] = new double[m];
        }
        //Копирование данных правого операнда в левый
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                A[i][j] = ob.A[i][j];
        return *this;
    }
    
 
    //Перегрузка оператора вычитания
    Matrix operator-(const Matrix &ob)
    {
        Matrix result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                result.A[i][j] = A[i][j] - ob.A[i][j];
        return result;
    }
 
    //Перегрузка оператора смены знака
    Matrix operator-() const
    {
        Matrix result;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                result.A[i][j] = -A[i][j];
        return result;
    }
 
    //---------------------------------------------------------------------------
 
};
 
int main()
{
    srand((unsigned)time(NULL));
    setlocale(0, "");
 
    Matrix M1;
    Matrix M2;
    Matrix M3;
 
    //Матрицы M1
    M1.setMatrix(); //Заполнение матрицы M1
    cout << "Матрица М1 New\n";
    M1.getMatrix(); //Вывод матрицы M1
 
    //Матрицы M2
    M2.setMatrix(); //Заполнение матрицы M2
    cout << "Матрица М2 New\n";
    M2.getMatrix(); //Вывод матрицы M2
 
    //Матрицы M3
    cout << "Матрица М3 New\n";
    M3.getMatrix(); //Вывод матрицы M3
 
    cout << "Присваивание\n";
    M3 = M1; M3.getMatrix(); M1.getMatrix();
 
    cout << "Вычитание\n";
    M3 = M3 - M2 - M1 - M3; M1.getMatrix(); M2.getMatrix(); M3.getMatrix();
        cout << "Смена знака\n";
    M3 = -M2; M2.getMatrix(); M3.getMatrix();
 
 
    cout << endl;
    system("pause");
    return 0;
Но теперь при вычитании "M3 = M3 - M2 - M1 - M3;" слишком часто вызывается Дестркуктор, и даже повторяется
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
27.04.2018, 10:04 6
Ну результат-то верный?
1
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
28.04.2018, 09:29  [ТС] 7
Результат да, вроде получил то что хотел))
А с деструктором что нибудь придумаю
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
28.04.2018, 09:46 8
Что значит слишком часто? Там же временные объекты создаются. Память корректно освобождается?
0
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
28.04.2018, 11:20  [ТС] 9
Прошу прощения, ошибка в моей невнимательности. Все работает! Не разделил вывод, и не совсем правильно отобразилось в консоли, из за этого я подумал что срабатывает деструктор 2 раза.
Миниатюры
Класс, конструктор, деструктор и прочее  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2018, 11:20
Помогаю со студенческими работами здесь

Добавить в класс хотя бы один конструктор и деструктор
Вот сама программа, заранее спасибо за помощь! #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Создать любой класс. Реализовать конструктор, деструктор, продемонстрировать работу
помогите создать класс любой можно про автомобиль,мяч,прямоугольник и тд...,чтобы были...

Разработать класс Airplane (самолет). Определить конструктор и деструктор. Реализовать объявленные методы доступа к данным.
решите пожалуйста вот эту задачу, вроде бы простая.. и если можно объясните, что где что значит. ...

Класс "Матрица": конструктор, деструктор и перегрузка операторов
Матрица – KMatrix Методы: конструкторы, деструктор; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru