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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Александр Летов
0 / 0 / 1
Регистрация: 06.02.2016
Сообщений: 128
#1

Перегрузка оператора сложения. (Сложение массивов) - C++

07.10.2016, 09:32. Просмотров 361. Ответов 1
Метки нет (Все метки)

Задание целиком:
Кликните здесь для просмотра всего текста

/*
Создать класс Динамический массив. Класс должен содержать
• конструкторы (по количеству элементов, по массиву и количеству элементов), в том числе конструктор копирования; +
• деструктор; +
• перегруженную операцию присваивания; +
• функцию добавления элемента в конец массива и в заданную позицию;
• функцию удаления элемента из заданной позиции;
• функция подсчета количества вхождений заданного значения в массив. +
В классе должна быть предусмотрена операция помещения в поток и операция извлечения из потока элементов объекта. +
Динамический массив из элементов типа int дополнительно должен предусматривать возможность перегрузки:
операции сложения (+) - поэлементное сложение (результат новый объект класса) +-
операции умножения (*) - скалярное произведение векторов +
операций префиксного и постфиксного инкремента (++a, a++) – увеличение всех элементов на 1.
функции модуля (abs) - длина вектора (не массива) +
*/


Интересует перегрузка сложения.
Если сделать
C++
1
C = A+B
, то массив создаётся, тут же разрушается и, соответственно на вывод идёт, что массив пуст.
Если
C++
1
cout << A+B
, то всё выводится.

Код:
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<clocale>
#include <math.h>
using namespace std;
 
class dinArr
{
    protected:
        int col, *arr;
    public:
        
        dinArr(int k, int *mas);
        dinArr(int k = 0, int data = 0); // конструктор массива
        dinArr(const dinArr &d); // конструктор копирования
        ~dinArr(); // деструктор массива
 
        friend ostream& operator << (ostream &out, const dinArr &d); // перегрузка вывода массива
        friend istream& operator >> (istream &in, dinArr &d); // перегрузка ввода массива
 
        dinArr& operator = (const dinArr& d); // перегрузка присваивания
        int operator * (const dinArr& d_2); // перегрузка умножения
        dinArr operator + (const dinArr& d_2); // перегрузка сложения
 
        int incomming(); // фунцкция подсчёта количества вхождений
        
        float abs(); // длинна массива
};
 
dinArr::dinArr(int k, int data) // конструктор массива
{
    if(k > 0) // если количество элементов не 0
    {
        arr = new int[k]; // Инициализируем массив на k элементов
        col = k; // сохраняем размер в col
        for(int i(0); i < col; i++) // заполняем массив от 0 до k элемента
        {
            arr[i] = data; // вставляем одно и то же число в каждую ячейку
        }
    }
    else // иначе массив пустой
    {
        col = 0; // Количество = 0
        arr = NULL; // Массив не инициализирован/создан. Переменная пустая и память под неё не выделилась.
    }
    cout << "Cоздан массив\n";
}
 
dinArr::dinArr(int k, int *mas) // Заполнение массива данными из входящего массива
{
    if(k > 0) // Если размер не 0
    {
        arr = new int[k]; // Инициализируем массив на k элементов
        col = k; // сохраняем размер в col
        for(int i(0); i < col; i++) // заполняем массив от 0 до k элемента
        {
            arr[i] = mas[i]; // вставляем в элемент под номером i значение из входящего массива
        }
    }
    else
    {
        col = 0; // Количество = 0
        arr = NULL; // Массив не инициализирован/создан. Переменная пустая и память под неё не выделилась.
    }
    cout << "Cоздан массив\n";
 
dinArr::dinArr(const dinArr &d)
{
    col = d.col; // Берем количество элементов из старого объекта
    
    if(d.col != NULL) // Если в старом массиве задано количество элементов
    {
        for(int i(0); i < col; i++) // В цикле от 0 элемента до col
        {
            arr[i] = d.arr[i]; // Заполняем массив данными из копируемого массива
        }
    }
    else arr = NULL; // Нулевая длинна - несуществующий массив
}
 
dinArr::~dinArr() // деструктор
{
    if (arr != NULL) delete [] arr; // Если массив был инициализирован, чистим от него память
    cout << "Массив разрушен\n";
}
 
dinArr& dinArr::operator = (const dinArr &d)
{
    if(&d == this) return *this; // (dinArr = dinArr2) Если dinArr == dinArr2, то возвращяем себя.
    if(arr != NULL) delete[] arr; // Если массив инициализирован, удаляем его. ЧТО?!
 
}
 
 
// "если сделать так, то выводит хрень"
// upd: уже не выводит. Починил
int dinArr::operator * (const dinArr& d_2) // скалярное произведение
{
    int res(0); // обнуляем результат
    if(col <= d_2.col) // если количество элемнтов одинаковое
    {
        for(int i(0); i < col; i++)
        {
            res += arr[i]*d_2.arr[i]; // считаем скалярное произведение.
        }
    }
    else if(d_2.col < col)
    {
        for(int i(0); i < d_2.col; i++)
        {
            res += arr[i]*d_2.arr[i]; // считаем скалярное произведение.
        }
    }
    return res;
}
 
dinArr dinArr::operator + (const dinArr& d_2) // сложение векторов
{
    dinArr resArr(col,0);
    if(col <= d_2.col) // если количество элемнтов одинаковое
    {
        resArr.col = col;
        for(int i(0); i < resArr.col; i++)
        {
            resArr.arr[i] = arr[i]+d_2.arr[i];
        }
    }
    else if(d_2.col < col)
    {
        resArr.col = d_2.col;
        for(int i(0); i < resArr.col; i++)
        {
            resArr.arr[i] = arr[i]+d_2.arr[i];
        }
    }
    return resArr;
}
 
ostream& operator << (ostream& out, const dinArr &d) // перегрузка оператора вывода
{
    if(d.arr == NULL) out << "Массив пуст" << endl;
    else
    {
        for(int i(0); i < d.col; i++)
        {
            out << d.arr[i] << "  ";
        }
    out << endl;
    }
}
 
//
istream& operator >> (istream& in, dinArr &d) // перегрузка ввода
{
    cout << "Количество элементов: ";
    in >> d.col;
    d.arr = new int[d.col];
    for(int i(0); i < d.col; i++)
    {
        cout << "Элемент массива: ";
        in >> d.arr[i];
    }
    return in;
}
 
// Сколько в массиве значений x
int dinArr:: incomming()
{
    int counter(0), x(0);
    cout << "Введите искомое значение: " << endl;
    cin >> x;
    if(arr != 0)
    {
        for(int i(0); i < col; i++)
        {
            if(arr[i]==x)
            {
                counter++;
            }
        }
    }
    cout << "Количество вхождений исходного значения: ";
    return counter;
}
 
float dinArr:: abs()
{
    float sum(0);
    if(arr != 0)
    {
        for(int i(0); i < col; i++)
        {
            sum += pow(arr[i],2);
        }
        return sqrt(sum);
    }
}
 
int main()
{
    setlocale(LC_ALL,"rus");
    dinArr A, B, C;
    cin >> A;
    cin >> B;
    //C = A;
    cout << "Массив А: " << A << endl;
    cout << "Массив B: " << B << endl;
    cout << A.incomming() << endl;
    cout << "Скалярное произведение А на В = " << A*B << endl;
    C = A+B; // так не работает
    cout << "Массив C: " << C << endl;
    cout << "Сумма = " << A+B << endl; // так работает. WTF?
    cout << "Длина вектора A равна " << A.abs() << endl;
    system("pause");
    return 0;
}


Перегрузка:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
dinArr dinArr::operator + (const dinArr& d_2) // сложение векторов
{
    dinArr resArr(col,0);
    if(col <= d_2.col) // если количество элемнтов одинаковое
    {
        resArr.col = col;
        for(int i(0); i < resArr.col; i++)
        {
            resArr.arr[i] = arr[i]+d_2.arr[i];
        }
    }
    else if(d_2.col < col)
    {
        resArr.col = d_2.col;
        for(int i(0); i < resArr.col; i++)
        {
            resArr.arr[i] = arr[i]+d_2.arr[i];
        }
    }
    return resArr;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2016, 09:32     Перегрузка оператора сложения. (Сложение массивов)
Посмотрите здесь:
C++ Перегрузка оператора сложения
Перегрузка оператора сложения C++
Перегрузка оператора сложения C++
Перегрузка оператора сложения C++
Перегрузка оператора сложения C++
C++ Перегрузка оператора сложения матриц
Перегрузка оператора +, для сложения координат 2х векторов C++
C++ Перегрузка оператора сложения в классе выдает ошибку с деструктором
C++ Перегрузка оператора + для сложения двух экземпляров класса
Перегрузка оператора operator+() в пользовательском классе (сложение строк) C++
Произвести сложение двух массивов 5х3 по правилам сложения матриц C++
Перегрузка оператора сравнения (==) для массивов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
шКодер самоучка
1784 / 1585 / 576
Регистрация: 09.10.2013
Сообщений: 3,546
Записей в блоге: 6
Завершенные тесты: 2
07.10.2016, 09:54     Перегрузка оператора сложения. (Сложение массивов) #2
Цитата Сообщение от Александр Летов Посмотреть сообщение
тут же разрушается
так у вас прописано в операторе присваивания.
нужно вынести повторяющийся код копирования внутреннего массива в отдельный метод и использовать его.
Yandex
Объявления
07.10.2016, 09:54     Перегрузка оператора сложения. (Сложение массивов)
Ответ Создать тему
Опции темы

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