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

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

Войти
Регистрация
Восстановить пароль
 
[O]Clic[K]
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55
#1

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

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

Перегрузка оператора "++" и "--" в чем может быть причина нарушение прав доступа? - C++
Вот такой вот код #include &lt;iostream&gt; class d { private: int size ; char *n; public: d()

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка - C++
#include &lt;iostream&gt; #include&lt;ctime&gt; #include&lt;stdio.h&gt; #include&lt;locale.h&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; ...

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

Класс "Дробь". Перегрузка оператора "==" - C++
template &lt;class T&gt; void polynomial&lt;T&gt;::refresh(){ //отбрасывающую старшие члены полинома с нулевыми коэффициентами int counter = 0;...

Класс "Матрица", перегрузка оператора "+" - C++
Здравствуйте. Создаю класс матрица, в нём перегружаю оператор &quot;+&quot;. На этапе компиляции всё замечательно, но при запуске программа вылетает....

Перегрузка оператора "+", чтобы выполнял "*" - C++
Ребят, привет всем, возник такой вопрос: возможно ли перегрузить оператор &quot;+&quot; так, чтоб выполнялось умножение? Например вводится...

1
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
11.11.2012, 18:39 #2
[O]Clic[K], вы остальной код сами писали? Если да, то в чём проблема? Если нет, то что вы пробовали сделать самостоятельно?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 18:39
Привет! Вот еще темы с ответами:

Перегрузка оператора "<<" для вывода пользовательских классов - C++
Всем доброго времени суток. Пытаюсь сделать перегрузку оператора &quot;&lt;&lt;&quot; для того, чтобы можно было выводить объекты пользовательского класса...

Перегрузка "оператора +" для сложения массива объектов - C++
Как перегрузить правильно оператор+ в данном случае или так делать нельзя? Ещё как-то туда надо передать размеры этого массива... и как...

Перегрузка операторов: Можно ли вынести "тело" оператора (расчеты) из H в CPP? - C++
Помогите новичку! Пишу класс и вынес его в отдельные файлы *.CPP и *.H Теперь пытаюсь переопределить операторы. Начал с = По примеру...

Перегрузка оператора вывода в классе "Время" - C++
Здравствуйте. Столкнулся с проблемой при работе с классом (Время), что выводит или чушь или вообще ничего не выводит. Прописал (вроде бы) 1...


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

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

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