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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Символьные массивы http://www.cyberforum.ru/cpp-beginners/thread690213.html
Ребята, я по некоторих причинах пропустил пару по етой теме, и не знаю толком как работать с символьними масивами. Нужно сделать задание для лабараторки: ввести стоку и инвертировать ее(первое слово...
C++ Переписать код без использования указателей Как эту функцию можно записать используя указателей? char* ptr1=text; char* ptr2; sLen=strlen(str1); while(ptr1){ ptr2=ptr1; ptr1=strstr(ptr1+sLen, str1); } if... http://www.cyberforum.ru/cpp-beginners/thread690206.html
Обьясните условие задачи C++
Обьясните пожалуйста что нужно сделать?? Вычислить значение y в зависимости от выбранной функции от (x), аргумент которой определяется с поставленной условия. Возможные значения функции от (x):...
C++ Все ли элементы последовательности не равны числу X
Требуется написать программу по данному условию: Задана произвольная последовательность, все ли элементы последовательности не равны числу X. ??? программа без массивов. Есть такой код, он по...
C++ Создать линейный список целых чисел. Вычислить количество вхождений заданного числа в очереди http://www.cyberforum.ru/cpp-beginners/thread690197.html
Создать линейный список целых чисел. Вычислить количество вхождений заданного числа в очереди
C++ Составить поисковое дерево Короче программа должна из случайно сформированного массива mas1, составить поисковое дерево(то бишь программа должна сделать так чтобы в верху был наименьший элемент далее с ссылкой на соседние... подробнее

Показать сообщение отдельно
[O]Clic[K]
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55

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

06.11.2012, 18:50. Просмотров 573. Ответов 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;
}
0
Вложения
Тип файла: rar 4_laba_7_variant.rar (5.7 Кб, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru