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

Правильно сделана перегруженная операция присваивания? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вывод контейнера типа set <string> в файл http://www.cyberforum.ru/cpp-beginners/thread928285.html
Конечный файл пустует, я всяко-разно пытался, вот мой вариант с итераторами. Смотрите закоментированный код - всё остальное полностью рабочее, кроме вывода в файл. #include <iostream> #include <algorithm> #include <string> #include <iterator> #include <set> #include <fstream> #include <cstdlib> #include <vector>
C++ Vector в С++(2) у меня есть абстрактный класс Фигура (базовый), от него наследуются классы Circle, Rectangle , я создал вектор типа указатель на Фигура и положил туда вперемешку объекты классов Окружность и Прямоугольник, а теперь мне нужно вызвать методы каждого объекта вектора, мне подсказали, как написать этот метод, но не пойму почему надо так (выделено желтым) базовый класс: class Figure { public:... http://www.cyberforum.ru/cpp-beginners/thread928278.html
C++ Как написать программу с несколькими .cpp файлами
Как написать программу с несколькими .cpp файлами? Сколько сам пробывал, появляется куча ошибок( Конкретно меня интересует, как их соединить вместе IDE - Microsoft Visual Studio 2010
Не могу собрать программу C++
собираю в netbeans + cygwin исходники выдает ошибку не знаю как исправить. TCPClient.cpp // TCPClient.cpp : Defines the entry point for the application. // #include "stdafx.c"
C++ Вызов dll ресурсов в dll http://www.cyberforum.ru/cpp-beginners/thread928212.html
Помогите пожалуйста, вот такого рода проблемка вышла: Есть у меня dll и есть необходимость вызвать ресурс в потоке dll файла, который создается при подключении. Ресурс объявляю как обычно это делаю в exe проектах: выбираю создать ресурс, выбираю файл, в resource.h беру ID ресурса, а сам .h инклюдом подключаю. При попытке проверить ресурс функцией FindResource. Передаю ей модуль (получаю из...
C++ Как в main() создать указатель на функцию, которая находится в классе? В этом примере как определить указатель на функцию F()? class A { public: bool F(int &a, int &b) { return a<b; } }; int main() { подробнее

Показать сообщение отдельно
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.07.2013, 09:20  [ТС]     Правильно сделана перегруженная операция присваивания?
Цитата Сообщение от Jupiter Посмотреть сообщение
вот красивый пример двусвязного списка со всеми прелестями ООП
за ссылку дополнительное спасибо. завтра посмотрю ту тему, а то уже спать хочу

Добавлено через 10 часов 39 минут
доделал эту программу. когда меняю местами два узла, то сами узлы не трогаю, а изменяю только значения T value;

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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
template<typename T>
bool IsMinToMax(const T &a, const T &b)         { return a<b; }
 
template<typename T>
bool IsMaxToMin(const T &a, const T &b)         { return a>b; }
 
 
 
 
 
 
 
 
// узел
template<typename T>
struct TNode
{
    T value;                    // значение
    TNode<T> *ptrPrev;          // указатель на предыдущий узел
    TNode<T> *ptrNext;          // указатель на следующий узел
};
 
// обмен двух узлов
template<typename T>
void SwapTNode(TNode<T> *ptrA, TNode<T> *ptrB)
{
    T temp=ptrA->value;
    ptrA->value=ptrB->value;
    ptrB->value=temp;
}
 
 
 
 
 
// список
template<typename T>
class TCList
{
    template<typename T>
    friend std::ostream &operator<<(std::ostream &out, const TCList<T> &list);
 
public:
    TCList();
    ~TCList();                                          // удаление всех созданных узлов
 
    TNode<T> *GetBegin() const;                         // возвращает указатель на первый узел
    TNode<T> *GetEnd() const;                           // возвращает указатель на последний узел
    
    TNode<T> *PushBack(const T &value);                 // вставка нового узла в конец списка. возвращает указатель на этот узел
    TNode<T> *PushFront(const T &value);                // вставка нового узла в начало списка.
 
    bool PopBack();                                     // удаление узла в конце списка
    bool PopFront();                                    // удаление узла в начале списка
 
    void DeleteList();                                  // удаление всех узлов
 
    size_t GetTotalNodes() const;                       // возвращает количество узлов в списке
 
    // сортировка узлов списка
    void Sort(TNode<T> *ptrBegin, TNode<T> *ptrEnd, bool (*ptrFunc)(const T &, const T &));
 
private:
    TNode<T> *mPtrBegin;                                // указатель на первый узел
    TNode<T> *mPtrEnd;                                  // указатель на последний узел
    size_t mTotalNodes;                                 // количество узлов в списке
};
 
 
 
 
 
 
 
template<typename T>
TCList<T>::TCList()
{
    mPtrBegin = mPtrEnd = NULL;
    mTotalNodes = 0;
}
 
template<typename T>
TCList<T>::~TCList()
{
    DeleteList();
}
 
template<typename T>
TNode<T> *TCList<T>::GetBegin() const       { return mPtrBegin; }
 
template<typename T>
TNode<T> *TCList<T>::GetEnd() const         { return mPtrEnd; }
 
template<typename T>
TNode<T> *TCList<T>::PushBack(const T &value)
{
    if (mPtrBegin == NULL)                              // если в списке нет узлов
    {
        mPtrBegin = new TNode<T>;                       // выделяем место для первого узла
 
        mPtrBegin->value = value;
        mPtrBegin->ptrPrev = NULL;                      // нет предыдущего узла
        mPtrBegin->ptrNext = NULL;                      // нет следующего узла
 
        mPtrEnd = mPtrBegin;                            // в списке один узел -> первый и последний узлы совпадают
    }
    else                                                // в списке есть хотя бы один узел
    {
        mPtrEnd->ptrNext = new TNode<T>;
 
        mPtrEnd->ptrNext->value = value;
        mPtrEnd->ptrNext->ptrPrev = mPtrEnd;
        mPtrEnd->ptrNext->ptrNext = NULL;
 
        mPtrEnd = mPtrEnd->ptrNext;                     // последний узел изменился
    }
 
    ++mTotalNodes;                                      // еще один узел создан
 
    return mPtrEnd;
}
 
template<typename T>
TNode<T> *PushFront(const T &value)
{
    if (mPtrBegin == NULL)                              // если в списке нет узлов
    {
        mPtrBegin = new TNode<T>;                       // выделяем место для первого узла
 
        mPtrBegin->value = value;
        mPtrBegin->ptrPrev = NULL;                      // нет предыдущего узла
        mPtrBegin->ptrNext = NULL;                      // нет следующего узла
 
        mPtrEnd = mPtrBegin;                            // в списке один узел -> первый и последний узлы совпадают
    }
    else
    {
        mPtrBegin->ptrPrev = new TNode<T>;
 
        mPtrBegin->ptrPrev->value = value;
        mPtrBegin->ptrPrev->ptrPrev = NULL;
        mPtrBegin->ptrPrev->ptrNext = mPtrBegin;
 
        mPtrBegin = mPtrBegin->ptrPrev;
    }
 
    ++mTotalNodes;
 
    return mPtrBegin;
}
 
template<typename T>
bool TCList<T>::PopBack()
{
    if (mTotalNodes >= 2)
    {
        mPtrEnd = mPtrEnd->ptrPrev;                     // перешли в предыдущий узел
 
        delete mPtrEnd->ptrNext;
        mPtrEnd->ptrNext = NULL;
 
        --mTotalNodes;                                  // узел удален
        return true;
    }
    else if (mTotalNodes == 1)
    {
        delete mPtrBegin;
        mPtrBegin = NULL;
 
        --mTotalNodes;                                  // узел удален
        return true;
    }
 
    return false;
}
 
template<typename T>
bool TCList<T>::PopFront()
{
    if (mTotalNodes >= 2)                               // если в списке хотя бы два узла
    {
        mPtrBegin = mPtrBegin->ptrNext;
 
        delete mPtrBegin->ptrPrev;
        mPtrBegin->ptrPrev = NULL;
 
        --mTotalNodes;
        return true;
    }
    else if (mTotalNodes == 1)                          // если в списке один узел
    {
        delete mPtrBegin;
        mPtrBegin = NULL;
 
        --mTotalNodes;
        return true;
    }
 
    return false;
}
 
template<typename T>
void TCList<T>::DeleteList()
{
    while (PopBack()) ;
}
 
template<typename T>
size_t TCList<T>::GetTotalNodes() const         { return mTotalNodes; }
 
 
// сортировка узлов списка
template<typename T>
void TCList<T>::Sort(TNode<T> *ptrBegin, TNode<T> *ptrEnd, bool (*ptrFunc)(const T &, const T &))
{
    for (TNode<T> *ptr1=mPtrBegin; ptr1!=NULL; ptr1=ptr1->ptrNext)
    {
        bool flag=false;
 
        for (TNode<T> *ptr2=mPtrBegin; ptr2!=NULL; ptr2=ptr2->ptrNext)
            if (!ptrFunc(ptr2->value, ptr1->value))
            {
                SwapTNode(ptr1, ptr2);
                flag=true;
            }
 
        if (!flag) break;
    }
}
 
 
template<typename T>
std::ostream &operator<<(std::ostream &out, const TCList<T> &list)
{
    TNode<T> *ptrCurrNode = list.mPtrBegin;
 
    while (ptrCurrNode != NULL)
    {
        out << ptrCurrNode->value << " ";
        ptrCurrNode = ptrCurrNode->ptrNext;
    }
 
    return out;
}










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
#include <iostream>
#include "header.h"
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    TCList<int>     listInt;
 
    listInt.PushBack(3);
    listInt.PushBack(1);
    listInt.PushBack(2);
 
    std::cout << "начальный список:     " << listInt << std::endl;
 
    listInt.Sort(listInt.GetBegin(), listInt.GetEnd(), IsMinToMax);
    std::cout << "по возрастанию: " << listInt << std::endl;
 
    listInt.Sort(listInt.GetBegin(), listInt.GetEnd(), IsMaxToMin);
    std::cout << "по убыванию: " << listInt << std::endl;
 
    system("pause");
    return 0;
}
 
Текущее время: 06:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru