Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

07.10.2016, 09:32. Просмотров 670. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2016, 09:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора сложения. (Сложение массивов) (C++):

Перегрузка оператора сложения - C++
Добрый день. Есть вот эта перегрузка оператора сложения для класса многочлена. Polynom Polynom::operator+(Polynom P) { Polynom...

Перегрузка оператора сложения - C++
Здравствуйте! Имеется такой код: class ClassA { public: ClassA() { m = 1;

Перегрузка оператора сложения - C++
Некорректно выводит результат сложения- результат просто не записывается в конечную переменную. Думаю, что проблема либо в операторе...

Перегрузка оператора сложения - C++
оч надо лабу срочно написать помогите плиз... Разработать программу с демонстрацией механизма перегрузки оператора сложения

Перегрузка оператора сложения - C++
У меня есть класс, который содержит в себе строку и ее длину. Класс распределяет динамическую память для хранения строки. Передо мной стоит...

Перегрузка оператора сложения матриц - C++
Всем привет. Народ, снова нуждаюсь в вашей помощи. Есть класс матрицы class DoubleArr { private: double** arr; // массив ...

1
Max Dark
шКодер самоучка
1854 / 1654 / 603
Регистрация: 09.10.2013
Сообщений: 3,679
Записей в блоге: 6
Завершенные тесты: 2
07.10.2016, 09:54 #2
Цитата Сообщение от Александр Летов Посмотреть сообщение
тут же разрушается
так у вас прописано в операторе присваивания.
нужно вынести повторяющийся код копирования внутреннего массива в отдельный метод и использовать его.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2016, 09:54
Привет! Вот еще темы с ответами:

Перегрузка оператора +, для сложения координат 2х векторов - C++
Задание: разработать абстрактный тип данных &quot;Вектор&quot;. АТД должен обеспечивать : ввод\вывод векторов,сложение\вычитание,перемножение на...

Перегрузка оператора сложения в классе выдает ошибку с деструктором - C++
Здравствуйте, взял у Липманна программу, которую по заданию надо доработать. Ее смысл заключается в том, что объект класса (динамическая...

Перегрузка оператора + для сложения двух экземпляров класса - C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace::std; class str_type{ char...

Перегрузка оператора operator+() в пользовательском классе (сложение строк) - C++
Хотел научить класс складывать строки, но на моменте освобождения памяти temp происходит ошибка. Поля класса: char* Str, int length...


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

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

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