-16 / 0 / 0
Регистрация: 14.04.2022
Сообщений: 82
1

Перегрузка оператора присваивания для стека

26.05.2023, 22:20. Показов 481. Ответов 2

Author24 — интернет-сервис помощи студентам
недавно узнал, что чтобы правильно работал оператор присваивания для сложных типов данных - нужно удалять(освобождать память) того, который стоит до оператора. Пример: есть у нас стек А и стек В, и при операции А=В, нужно очистить стек А полностью(я в свою очередь просто делал копию). И как дело дошло до строк кода, то сразу начались вопросы: как это реализовать? может стоить использовать операцию Pop(), пока указатель на вершину не станет указывать на nullptr? или вовсе вызвать деструктор для него после операции присваивания? Так вот вопрос: как корректно перегрузить оператор присваивания для Стека?
Код:
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
#include <iostream>
#include <math.h>
using namespace std;
 
template <typename T> // структура - узел
struct stack
{
    T x;
    stack<T>* next;
};
 
template <typename T> // шаблонный класс стек на базе односвязного списка
class Stack
{
private:
    int size = 100; // емкость стека
public:
    stack<T>* pTop; // указатель на вершину стека
    Stack() {
        pTop = nullptr; // конструктор по умолчанию
    }
 
    ~Stack() {
        stack<T>* p; // дополнительный указатель
        stack<T>* p2;
        p = pTop;
        while (p != nullptr) {
            p2 = p; // сделать копию из p
            p = p->next; // перейти на следующий элемент стека
            delete p2; // удалить память, выделенную для предыдущего элемента
        }
        pTop = nullptr; // поправить вершину стека
    }
 Stack<T>& operator=(const Stack<T>& LS) // перегрузка оператора присваивания
    {
        stack<T>* p; // дополнительный указатель
        stack<T>* p2;
        stack<T>* p3;
        // Инициализировать pTop
        pTop = nullptr;
        p3 = nullptr;
        p = LS.pTop; // указатель p двигается по списку SL.pTop->
        while (p != nullptr)
        {
            // 1. Сформировать узел p2
            try {
                // попытка выделить память
                p2 = new stack<T>;
            }
            catch (bad_alloc e)
            {
                // если память не выделена, то выход
                cout << e.what() << endl;
                return *this;
            }
            p2->item = p->item;
            p2->next = nullptr;
            // 2. pTop = pTop + p2
            if (pTop == nullptr) // создать стек
            {
                pTop = p2;
                p3 = p2;
            }
            else
            {
                p3->next = p2;
                p3 = p3->next;
            }
            // 3. Перейти на следующий элемент
            p = p->next;
        }
        return *this;
    }
};
...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2023, 22:20
Ответы с готовыми решениями:

Перегрузка присваивания для стека
Пытаюсь написать перегрузку присваивания для стека. Как видно из кода ниже, я сначала с помошью...

Перегрузка оператора присваивания для строк
написал программу. проверил. вроде все правильно. но не работает. программа долjна посредством...

Перегрузка оператора присваивания для указателей
Пытаюсь вникнуть в самые азы перегрузки операторов. По гайдам повторил перегрузку оператора...

Перегрузка оператора + для стека
Добрый день. Прошу помощи с перегрузкой этой операции. Цель: перегрузить + так,чтобы он складывал...

2
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
26.05.2023, 22:39 2
aldr, copy-and-swap idiom - хрестоматийный способ.
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
26.05.2023, 23:26 3
Цитата Сообщение от aldr Посмотреть сообщение
что чтобы правильно работал оператор присваивания для сложных типов данных - нужно удалять(освобождать память) того, который стоит до оператора.
Ну что значит "нужно"... Все зависит от природы объекта и вашего дизайна.

Традиционная семантика оператора присваивания говорит, что объект слева должен стать копией объекта справа. А уж насколько "точная" это будет копия - вам решать. Понятно, что разумно ожидать, что с точки зрения хранимого логического значения, объект слева должен получить то же значение, что и объект справа. А вот с точки зрения всяких посторонних/сопутствующих деталей - все уже не так однозначно.

Например, если мы присваваем более короткий вектор более длинному

C++
1
2
std::vector<int> a = { 1, 2, 3, 4, 5 },  b = { 6, 7 };
a = b;
то нужно ли нам освобождать всю "старую" память вектора a? Или нужно освобождать только лишнюю память вектора a? Или лучше вообще ничего не освобождать, а просто скопировать данные, исправить size(), а лишнюю память просто оставить на будущее в качестве неиспользованного capacity()?
0
26.05.2023, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2023, 23:26
Помогаю со студенческими работами здесь

Перегрузка оператора присваивания
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было элементу одного...

Перегрузка оператора присваивания
Здравствуйте, недавно читал про перегрузку операторов и решил поупражняться с этим, однако на...

Перегрузка оператора присваивания
Приветствую всех. Не могли бы подсказать как переопределить оператор присваивания. То что искал,...

Перегрузка оператора присваивания
Доброго времени суток! Возник вопрос по поводу перегрузки оператора присваивания. Пример...

Перегрузка оператора присваивания
Задание простое: по заданному классу составить простую программу с использованием динамической...

Перегрузка оператора присваивания
Доброго времени суток всем! Никак не могу правильно написать перегрузку оператора присваивания. ...


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

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

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