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

Перегрузка оператора "&" - C++

Восстановить пароль Регистрация
 
[O]Clic[K]
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55
06.11.2012, 18:50     Перегрузка оператора "&" #1
Нужна помощь!
Нужно перегрузить оператор &, чтобы он складывал исходный список и список, полученный перегрузкой оператора --, который выводит список в обратном порядке
Проект на Visual Studio в аттаче. Вот код:
Spisok.h
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
#pragma once // Защищает от повторой компиляции файлов. Т.е. iostream мы уже в мейне компильнули, тут он возьмется 
             // из main, а не будет собираться снова (очень сильно экономит время компиляции (при больших файлах))
#include <iostream>
 
using namespace std;
 
// Описание структуры 
struct node 
{
    int data;            // Поле с информацией
    struct node* next;   // Указатель на следующую структуру
};
 
// Объявление нашего класса
class CSpisok
{
/* К этим полям мы не имеем прямого доступа вне класса или дружественных функций.
Для того, чтобы получить их, будем пользоваться публичными методами */
private:
    node* head;     // Указатель на голову
    node* tail;     // На хвост
 
/* Публичные поля. Доступ к ним открыт везде */
public:
    /* Конструкторы */
    // По умолчанию + с параметром. Если не будет введена длина, то она будет равна 5
    CSpisok (int size = 5);
    // Конструктор копирования. Новый класс будет точной копией класса, на основе которого мы его создаем
    CSpisok(const CSpisok& input);
 
    /* Деструктор */
    ~CSpisok ();
 
    /* Методы (функции) класса */
    void Show (); // Вывод списка на экран
    // Константый метод получения головы списка
    node* GetHead (void) const
    { return head; }
 
    /* Перегрузка операторов */
    void operator ++ (void);
    void operator -- (void);
};
Spisok.cpp
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
#include "Spisok.h"
 
using namespace std;
 
// Конструкторы
CSpisok::CSpisok(int size)
{
    // Заполним список очередью. Ибо такое задание.
    // Список - первым вошел, первым вышел. Стек - первым вошел, последним вышел.
    // Пример: ввели с клавиатуры 1 2 3 4 5. Очередь: 1 2 3 4 5, стек: 5 4 3 2 1
 
    head = NULL;
    node* pointer;
 
    for (int i = 0; i < size; i++)
        if (head == NULL)
        {
            head = new node;
            head->data = rand()%99 + 1;  // Случайное число в диапазоне (от 0 до 99) + 1
            head->next = NULL;
            tail = head;
        }
        else
        {
            pointer = new node;
            pointer->data = rand()%99 + 1;
            tail->next = pointer;
            pointer->next = NULL;
            tail = pointer;
        }
}
CSpisok::CSpisok(const CSpisok& input)
{
    // Тут и далее будем использовать константные методы. Их отличие от простых - на конце у них
    // в прототипе слово const. Почему? Потому что входной параметр - константа, и изменить мы
    // её не можем. Поэтому мы и показываем компилятору, что данный метод не изменяет объект
 
    node* pointer;
    node* in_pointer = input.GetHead();
    head = NULL;
 
    while (in_pointer != NULL)
    {
        if (head == NULL)
        {
            head = new node;
            head->data = in_pointer->data;
            head->next = NULL;
            tail = head;
        }
        else
        {
            pointer = new node;
            pointer->data = in_pointer->data;
            tail->next = pointer;
            pointer->next = NULL;
            tail = pointer;
        }
        in_pointer = in_pointer->next;
    }
}
 
// Деструктор
CSpisok::~CSpisok(void)
{
    // Удаляем наш список из динамической памяти
    node* pointer = head;
    while (pointer != NULL)
    {
        node* _delete = pointer;
        pointer = pointer->next;
        delete _delete;
    }
}
 
// Вывод списка на экран
void CSpisok::Show () 
{
    for (node* pointer = head; pointer != NULL; pointer = pointer->next)
        cout << pointer->data << " ";
    cout << endl;
}
 
/* Перегрузка операторов */
void CSpisok::operator ++ (void)
{
    /* Сортируем методом пузырьков (что это такое - гуглим, ибо это
    самая простая сортировка и её должен знать каждый */
    node* p1 = head;
    while (p1) // Эквивалентно p1 != NULL
    {
        node* p2 = p1;
        while(p2)
        {
            if (p2->data < p1->data)
            {
                int tmp = p1->data;
                p1->data = p2->data;
                p2->data = tmp;
            }
            p2 = p2->next;
        }
        p1 = p1->next;
    }
}
void CSpisok::operator -- (void)
{
    /* Перевернуть список легко - достаточно пересоздать его стеком */
    node* tmp_head = NULL,
        * tmp_pointer,
        * pointer = head;
 
    while (pointer)
    {
        if (tmp_head == NULL)
        {
            tmp_head = new node;
            tmp_head->data = pointer->data;
            tmp_head->next = NULL;
        }
        else
        {
            tmp_pointer = new node;
            tmp_pointer->data = pointer->data;
            tmp_pointer->next = tmp_head;
            tmp_head = tmp_pointer;
        }
        // Заодно сразу будем чистить память, удаляя наш список, ибо потом он нам не нужен
        node* del = pointer;
        pointer = pointer->next;
        delete del;
    }
    head = tmp_head;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <locale>
#include <time.h>
#include "Spisok.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    CSpisok C1(8);
    C1++;
    C1.Show();
    C1--;
    C1.Show();
 
    cin.get();
    return 0;
}
Вложения
Тип файла: rar 4_laba_7_variant.rar (5.7 Кб, 4 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2012, 18:50     Перегрузка оператора "&"
Посмотрите здесь:

Перегрузка оператора вывода в классе "Время" C++
C++ Перегрузка оператора "-" (вычитание матриц)
C++ Перегрузка оператора "<<" для вывода пользовательских классов
Перегрузка операторов: Можно ли вынести "тело" оператора (расчеты) из H в CPP? C++
Перегрузка оператора "++" и "--" в чем может быть причина нарушение прав доступа? C++
Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка C++
Класс "Матрица". Перегрузка оператора "минус" C++
Перегрузка оператора "+", чтобы выполнял "*" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.11.2012, 18:39     Перегрузка оператора "&" #2
[O]Clic[K], вы остальной код сами писали? Если да, то в чём проблема? Если нет, то что вы пробовали сделать самостоятельно?
Yandex
Объявления
11.11.2012, 18:39     Перегрузка оператора "&"
Ответ Создать тему
Опции темы

Текущее время: 22:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru