Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.
Есть задание:

Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является объектом класса. Память под матрицу должна выделяться динамически (с помощью 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2018, 17:01
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 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
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2018, 10:04
Ну результат-то верный?
1
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
28.04.2018, 09:29  [ТС]
Результат да, вроде получил то что хотел))
А с деструктором что нибудь придумаю
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.04.2018, 09:46
Что значит слишком часто? Там же временные объекты создаются. Память корректно освобождается?
0
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 26
28.04.2018, 11:20  [ТС]
Прошу прощения, ошибка в моей невнимательности. Все работает! Не разделил вывод, и не совсем правильно отобразилось в консоли, из за этого я подумал что срабатывает деструктор 2 раза.
Миниатюры
Класс, конструктор, деструктор и прочее  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2018, 11:20
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточность в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер