Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 29.04.2022
Сообщений: 9
1

Шаблонный класс Матрица, перегрузка операторов

20.06.2022, 18:56. Показов 656. Ответов 4

Author24 — интернет-сервис помощи студентам
Всем здравствуйте, задали на дом создать шаблонный класс матрица с некоторыми методами и перегрузкой операторов >>, +, -, /, *. На перегрузке операторов у меня всё и ломается. Насколько я понял, у меня что-то не так в конструкторе перемещения, т.к. во время перегрузки операторов + - / * именно он и используется, чтобы переместить возвращаемое значение из функции в перегрузку оператора >>. Чтобы не засорять код оставил только самое нужное. Хелп пожалуйста)
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 <iostream>
 
using namespace std;
 
template <typename T>
void QuickSort(T*& arr, int first, int last);
 
template <typename T>
class Matrix
{
    T** arr;
    int rows, columns;
 
public:
 
    Matrix(int size1, int size2) //конструктор
    {
        rows = size1;
        columns = size2;
 
        arr = (T**) new T * [rows];
        for (int i = 0; i < rows; i++)
        {
            arr[i] = (T*)new T[columns];
        }
    }
 
    Matrix(const Matrix<T>& obj) //конструктор копирования
    {
        rows = obj.rows;
        columns = obj.columns;
 
        arr = (T**) new T * [rows];
        for (int i = 0; i < rows; i++)
        {
            arr[i] = (T*) new T[columns];
        }
 
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                arr[i][j] = obj.arr[i][j];
            }
        }
    }
 
    Matrix(Matrix<T>&& obj) noexcept //конструктор перемещения... помогите...
    {
        rows = obj.rows;
        columns = obj.columns;
        arr = obj.arr;
 
        for (int i = 0; i < rows; i++)
        {
            arr[i] = obj.arr[i];
            obj.arr[i] = nullptr;
        }
 
        arr = nullptr;
    }
 
    ~Matrix() //деструктор
    {
        for (int i = 0; i < rows; i++)
        {
            delete[] arr[i];
        }
 
        delete[] arr;
    }
 
    void SortMass() //обычная сортировка, не обращайте внимания
    {
        for (int i = 0; i < rows; i++)
        {
            QuickSort(arr[i], 0, columns - 1);
        }
    }
 
    void FillByRand() //заполнение матрицы рандомными числами
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                arr[i][j] = rand() % 100;
            }
        }
    }
 
    friend ostream& operator<<(ostream& output, const Matrix<T>& obj) //перегруз оператора вывода
    {
        for (int i = 0; i < obj.rows; i++)
        {
            for (int j = 0; j < obj.columns; j++)
            {
                output << obj.arr[i][j] << " ";
            }
            output << endl;
        }
 
        return output;
    }
 
    friend Matrix<T> operator+(const Matrix<T>& obj, T value)
    {   
        Matrix<T> new_matrix{ obj.rows, obj.columns };
 
        for (int i = 0; i < new_matrix.rows; i++)
        {
            for (int j = 0; j < new_matrix.columns; j++)
            {
                new_matrix.arr[i][j] = obj.arr[i][j] + value;
            }
        }
        //здесь то всё и ломается.
        //подозреваю, что проблема в конструкторе перемещения
        return new_matrix;
    }
};
 
int main()
{
    setlocale(LC_ALL, "ru");
    srand(time(NULL));
 
    Matrix<int> new_matrix1{ 5, 5 };
    new_matrix1.FillByRand();
    Matrix<int> new_matrix2{ new_matrix1 };
    new_matrix2.SortMass();
    cout << new_matrix2;
    cout << new_matrix2 + 100;
 
    return 0;
}
 
template <typename T>
void QuickSort(T*& arr, int first, int last)
{
    int left = first, right = last;
    T middle = arr[(left + right) / 2];
 
    if (first < last)
    {
        do
        {
            while (arr[left] < middle)
            {
                left++;
            }
            while (arr[right] > middle)
            {
                right--;
            }
            if (left <= right)
            {
                swap(arr[left], arr[right]);
                left++;
                right--;
            }
 
        } while (left < right);
 
        QuickSort(arr, first, right);
        QuickSort(arr, left, last);
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2022, 18:56
Ответы с готовыми решениями:

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

Матрица, перегрузка операторов
Дня доброго. Есть такая вот задачка: 24.02.Создать класс для работы с матрицами. Предусмотреть,...

Шаблонный класс матрица
Мне нужно написать шаблон класса матрицы и на основе шаблона описать класс для различных типов...

Шаблонный класс: матрица
Хочу запилить класс matrix - двумерный массив с помощью vector пишу: #include &lt;iostream&gt;...

Перегрузка операторов. Динамическая матрица
Задача: Создать класс КВАДРАТНАЯ МАТРИЦА 3X3. Элементы матрицы следует хранить в динамической...

4
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
20.06.2022, 19:02 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Matrix(Matrix<T>&& obj) noexcept //конструктор перемещения... помогите...
    {
        rows = obj.rows;
        columns = obj.columns;
        arr = obj.arr;
 
        for (int i = 0; i < rows; i++)
        {
            arr[i] = obj.arr[i];
            obj.arr[i] = nullptr;
        }
 
        arr = nullptr;//наверное тут должно было быть obj.arr = nullptr
    }
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
20.06.2022, 19:11 3
Лучший ответ Сообщение было отмечено tensence127 как решение

Решение

tensence127,
C++
1
2
3
4
5
6
7
    // #include <utility>
    Matrix(Matrix&& obj) noexcept //конструктор перемещения... помогите...
        : arr(std::exchange(obj.arr, nullptr))
        , rows(std::exchange(obj.rows, 0))
        , columns(std::exchange(obj.columns, 0))
    {
    }
1
0 / 0 / 0
Регистрация: 29.04.2022
Сообщений: 9
20.06.2022, 21:04  [ТС] 4
точно, я опечатался, но сути дела не меняет. Ошибка выскакивает во время выполнения деструктора, который почему-то выполняется во время return объекта из метода.
0
4772 / 2581 / 893
Регистрация: 29.11.2010
Сообщений: 5,582
20.06.2022, 23:26 5
Цитата Сообщение от tensence127 Посмотреть сообщение
T** arr;
Такой способ хранить двумерный массив внезапно сложен в создании/копировании/удалении и, что самое удивительное, не даёт ощутимых преимуществ.
Храните двумерные массивы в одномерных. Так существенно проще.

Не вижу операторов присваивания/перемещения и способа обратиться к элементам матрицы.
1
20.06.2022, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2022, 23:26
Помогаю со студенческими работами здесь

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

Перегрузка операторов. Класс VECTOR
Задание 1: Разработка класса. Разработайте класс VECTOR. Элемент класса: координаты...

Перегрузка операторов и абстрактный класс
Имеется два класса (DecString и SymbString), наследуемых от абстрактного AString. Можно ли...

Класс, перегрузка операторов, указатель *this
Здравствуйте, нужна помощь, написал код с классами, но преподаватель попросил убрать объекты...

Перегрузка операторов. Класс String
Зравствуйте! У меня есть вопрос. Реализовать класс String для работы со строками символов....

Класс многочлен, перегрузка операторов
Здравствуйте. Есть класс многочлен степени n от одной переменной x, задаваемый массивом своих...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru