Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 31.07.2017
Сообщений: 54
1

Деструктор, сложение объектов

06.01.2018, 21:05. Показов 2002. Ответов 8
Метки нет (Все метки)

Имеется код в котором создан класс Array. Я перегрузил оператор "+" и "=" для того чтобы складывать два объекта, которые представляют из себя массивы. При компиляции вылетает ошибка. Во время отладки я выяснил, что перегруженный оператор "+" после поэлементного сложения массивов двух объектов и поэлементного присваивания их суммы во временном объекте, удаляет просуммированные элементы во временном объекте при его возвращении. Я попробовал запустить без деструктора и код заработал, но все таки деструтор нужен. Как исправить проблему с деструктором???

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
#include <iostream>
using namespace std;
 
class Array
{
private:
    int *arr;
    int size;
public:
    Array()
    {
        arr = NULL;
        size = 0;
    }
 
    Array(int size1)
    {
        size = size1;
        arr = new int[size];
        for (int i = 0; i < size; i++)
        {
            arr[i] = 0;
        }
    }
 
    void InitializeArray()
    {
        for (int i = 0; i < size; i++)
            cin >> arr[i];
    }
 
    void ShowArray()
    {
        for (int i = 0; i < size; i++)
            cout << arr[i]<<endl;
    }
 
    Array operator+(const Array& other)
    {
        Array temp(size);
        for (int i = 0; i < size; i++)
        {
            temp.arr[i] = arr[i] + other.arr[i];
        }
    
        return temp; 
    }
 
    Array operator=(const Array& other)
    {
        size = other.size;
        arr = other.arr;
        return *this;
    }
 
    ~Array()
    {
        delete[] arr;
    }
};
 
 
int main()
{
    Array A(1);
    A.InitializeArray();
    Array B(1);
    B.InitializeArray();
 
    Array C = A + B;
    C.ShowArray();
 
    system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2018, 21:05
Ответы с готовыми решениями:

Массив объектов, деструктор
class cA { int r; public: cA(int t){r=t; cout &lt;&lt; &quot;cA konstruktor &quot; &lt;&lt; r &lt;&lt; endl;};...

Виртуальный деструктор и уничтожение объектов
Приветствую всех. вопрос наверное простой так, что не ругайтесь. столкнулся с проблемой...

Почему деструктор срабатывает больше раз, чем количество созданных объектов?
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот...

Сложение объектов класса Time
Здраствуйте, такая вот задача. надо в классе сложить два переменных. я по пробывал вот так но...

8
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
06.01.2018, 21:10 2
Лучший ответ Сообщение было отмечено Tasen как решение

Решение

Tasen,
Правило трёх: если вы определяете одно из трех: деструктор, конструктор копирования, копирующая операция присвоения, то вы должны определить все три. Есть также правило пяти, но сначала хотя бы три осильте.
Ваша операция присвоения (Array operator=(const Array& other)) (вы ее не используете, но все равно) реализована так, что в итоге *this и other будут ссылаться на один и тот же массив *arr, что приведёт ровно к таким же проблемам, что вы сейчас испытываете.
1
2 / 2 / 0
Регистрация: 31.07.2017
Сообщений: 54
06.01.2018, 21:22  [ТС] 3
alex white, спасибо за информацию, проблему решил. Правило трех мне теперь ясно, не могли бы вы рассказать о правиле пяти, потому что в поисковике эти правила не находятся.
0
1640 / 1090 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
06.01.2018, 21:24 4
Здесь и правило трех, и правило пяти, и правило нуля.
https://ru.wikipedia.org/wiki/... _(C%2B%2B)
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
06.01.2018, 21:25 5
Tasen, даже тут https://ru.m.wikipedia.org/wik... х_(C%2B%2B). Просто промотайте ниже. Но вообще, сначала желательно изучить семантику перемещения.
0
2 / 2 / 0
Регистрация: 31.07.2017
Сообщений: 54
07.01.2018, 11:42  [ТС] 6
Новичок, alex white, премного благодарен!

Добавлено через 13 часов 43 минуты
alex white, действительно оператор "=" никак не используется в программе, за место него работает конструктор копирования:

C++
1
2
3
4
5
6
7
8
9
Array(Array& other)
    {
        this->size = other.size;
        arr = new int[other.size];
        for (int i = 0; i < other.size; i++)
        {
            arr[i] = other.arr[i];
        }
    }
Я попробовал сделать так, но программа все равно его не использует:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array & operator=(const Array& other)
    {
        this->size = other.size;
        if (this->arr != nullptr)
        {
            delete[] this->arr;
        }
 
        this->arr = new int[other.size];
        for (int i = 0; i < other.size; i++)
        {
            this->arr[i] = other.arr[i];
        }
 
        return *this;
    }
Как сделать так чтобы оператор "=" использовался в коде программы?
0
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
07.01.2018, 13:37 7
Tasen,
C++
1
Array A; Array B; A = B;
0
2 / 2 / 0
Регистрация: 31.07.2017
Сообщений: 54
07.01.2018, 19:43  [ТС] 8
Reavolt, это понятно, дело в том, что реализация для перегруженного оператора "=" есть, но программа его не использует, и мне не понятно почему
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
07.01.2018, 19:49 9
Tasen, не путайте определение и инициализацию с присвоением.
Определение:
C++
1
2
3
4
5
T x;
T x(a,b);
T x{a,b};
T x = y;
....
Присвоение:
C++
1
x = y;
Для инициализации используются конструкторы, для присвоения соотвествующая операция.
В общем случае:
C++
1
T x; x = y;
Не равносильно:
C++
1
T x = y;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2018, 19:49
Помогаю со студенческими работами здесь

Сложение массивов из разных объектов класса
Я объявил в классе массив a и ввёл два объекта класса. Как сложить массив a разных объектов класса?

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Сложение объектов базового и наследуемых классов через виртуальную функцию
Нужно определить базовый класс с виртуальной функцией сложения. Кроме того перегрузка этой же...

Сложение двух динамических объектов: cannot add two pointers
Прегрузку оператора + для статических объектов написал Romb Romb::operator + (Romb &amp;X) { Romb...


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

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

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