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

Перегрузить операции - C++

Восстановить пароль Регистрация
 
M@ker
-73 / 19 / 1
Регистрация: 17.12.2010
Сообщений: 355
24.03.2011, 00:47     Перегрузить операции #1
Здравствуйте! Есть уже готовая программа , но в ней нужно перегрузить операции
+ добавление элемента;
- удаление элемента;
[ ] индексирование;
= копирование;
= = отношение равенства;
> отношение порядка;

Пожалуйста, кто может - напишите. Очень нужно !
Вот сам код:
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <string>
 
 
 
 
//Дополнительное имя типа для string.
typedef std::string value_type;
 
//Класс
class Stack
{
public: //всеобщий доступ к интерфейсу
    
    Stack() // Конструктор
        :head(0), m_size(0) //обнуляем головной узел и размер
    {
    }
    
    ~Stack() //Деструктор
    {
        clear();
    }
    
    void push(const std::string&);  
    
    void pop(); //удаление верхнего узла
    
    const value_type& top() const; //возвращаем элемент в верхушке стека
    
    size_t size() const {return m_size;} //возвращаем размер
    
    bool empty() const {return m_size == 0;} //проверяем пустой ли список
    
    void clear();
    
    friend std::ostream& operator <<(std::ostream&, const Stack&); //перегружаем вывод
    
    friend std::istream& operator >>(std::istream&, Stack&); //перегружаем ввод 
    
    void search(const value_type& value); 
 
private: //ограниченный доступ к реализации
    
    //структура узел стека
    struct Node
    {
        //Конструктор, инициализирует элемент узла переданным
        //в конструкторе параметром. Обнуляет указатель на след. узел.
        Node(const value_type& str_="")
            :str(str_), next(0)
        {
        }
        //Указатель на след. узел.
        Node* next;
        //Строка.
        value_type str;
    };
    //Голова списка (верх).
    Node* head;
    //Размер.
    size_t m_size;
};
 
void Stack::push(const value_type& s)
{
    // Создаем новый узел с строкой s
    Node* tmp=new Node(s);
    
    if(!empty())
    
        tmp->next=head; //инициализируем следующий узел за tmp верхом
    else
    
        tmp->next=0; // присваиваем  tmp = 0
    
    head=tmp; 
        
    ++m_size;
}
void Stack::pop()
{
    //Проверка на пустоту списка.
    //Если список пустой - удалять нельзя - тогда.
    if(empty())
    {
        //Если программа идет в режиме Debug - кидается ошибка, что стек пуст.
#ifdef _DEBUG
 
        std::_DEBUG_ERROR("Stack is empty");
 
 
#endif
    }
    
    Node* delNode=head; //заводим нову переменную типа Node
    
    head=head->next;//инициализируем верх следующим узлом после 
    
    delete delNode;
    
    --m_size;
}
const value_type& Stack::top() const 
{
    
        if(empty())
    {
#ifdef _DEBUG
        std::_DEBUG_ERROR("Stack is empty");
 
#endif
    }
    //Возвращаем строку, которая в головном узле.
    return head->str;
}
 
void Stack::clear()
{
    
    while(!empty())
    
        pop();
}
 
std::ostream& operator <<(std::ostream& os, const Stack& one)
{
    //Пробегая по всему стеку - выводим строки в нем.
    for(Stack::Node* tmp=one.head; tmp; tmp=tmp->next)
        os<<tmp->str<<'\n';
    os<<'\n';
    //Возвращаем поток.
    return os;
}
 
std::istream& operator >>(std::istream& is, Stack& one)
{
    value_type value;
    std::cout<<"Enter strings (EOF for end of input)\n";
    //До тех пор пока не будет послан сигнал EOF (CTRL+Z в Windows)
    //вводим строки
    while(std::getline(is, value))
        //Помещаем их в стек.
        one.push(value);
    //Возвращаем поток.
    return is;
}
 
void Stack::search(const value_type& value)
{
    //Пробегая по всему стеку сравниваем 
    //строку в текущем узле с поданной как параметр строкой
    //если равны - значит строка найдена.
    for(Stack::Node* tmp=head; tmp; tmp=tmp->next)
        if(tmp->str == value)
        {
            std::cout<<"String "<< value <<" is finded\n";
            return;
        }
    std::cout<<"String "<< value <<" is not finded\n";
}
//содержимое main тестирует всю программу, используя все функции из нее.
int main()
{
    Stack one;
    std::cin>>one;
    std::cout<<one;
    std::cout<<"Top of the stack: "<< one.top() <<'\n';
    std::cout<<"Top of the stack after pop: ";
    one.pop();
    std::cout<<one.top()<<'\n';
    std::string for_search;
    std::cout<<"Enter string for search\n";
    std::cin.clear();
    std::getline(std::cin, for_search);
    one.search(for_search);
    std::cout<<"Clear testing\n";
    one.clear();
    std::cout<<one;
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2011, 00:47     Перегрузить операции
Посмотрите здесь:

Перегрузить C++
Перегрузить операторы C++
Создать однонаправленный список, перегрузить операции + [] == >> << C++
C++ перегрузить операции в стэке и очереде
Перегрузить C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.03.2011, 02:07     Перегрузить операции #2
Ни одну из этих операций не буду реализовывать в стеке по двум причинам: 1) из принципа и 2) это стек.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.03.2011, 08:35     Перегрузить операции #3
silent_1991, Ну + то можно. + - push.
А остальное - да. Согласен
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
24.03.2011, 09:52     Перегрузить операции #4
разве у структуры есть конструктор?
да, и в класс просто так структуру добавить нельзя. можно добавить только объект этой структуры
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.03.2011, 11:16     Перегрузить операции #5
ailia, Серьезно? На самом деле можно. И класс и структуру и перечисление и юнион... Доступен будет только в области видимости этого класса. Удобно.
И да, у структуры есть конструктор. И вообще класс и структура различаются в С++ только правами доступа по-умолчанию.

Не по теме:

А я кстати, узнаю прогу, кек.

Yandex
Объявления
24.03.2011, 11:16     Перегрузить операции
Ответ Создать тему
Опции темы

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