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

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

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.07.2013, 21:13     Правильно сделана перегруженная операция присваивания? #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
// узел
template<typename T>
struct TNode
{
    TNode<T> &operator=(TNode<T> *right);
 
    T value;                    // значение
    TNode<T> *ptrPrev;          // указатель на предыдущий узел
    TNode<T> *ptrNext;          // указатель на следующий узел
};
 
template<typename T>
TNode<T> &TNode<T>::operator=(TNode<T> *right)
{
    delete *this;
 
    this = new TNode<T>;
    this->value = right->value;
    this->ptrPrev = right->ptrPrev;
    this->ptrNext = right->ptrNext;
 
    return *this;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 21:13     Правильно сделана перегруженная операция присваивания?
Посмотрите здесь:

правильно ли сделана программа C++
Перегруженная операция сложения C++
Что быстрее, операция присваивания или сравнения? C++
Операция присваивания C++
Атомарна ли операция присваивания в однопроцессорной машине? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.07.2013, 21:27     Правильно сделана перегруженная операция присваивания? #2
BigLow, по-хорошему оператору присваивания следовало бы принимать константную ссылку на объект класса, для которого осуществляешь перегрузку.
C++
1
TNode<T> &TNode<T>::operator=(const TNode<T>& right);
Вот моя мудрость для тебя)

ыыы, что это?
C++
1
delete *this;
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.07.2013, 21:32  [ТС]     Правильно сделана перегруженная операция присваивания? #3
ITcrusader, а если через константные указатели, то вот так правильно будет?


C++
1
2
3
4
5
6
7
template<typename T>
TNode<T> *TNode<T>::operator=(const TNode<T> *right)
{
    delete *this;
    this=right;
    return this;
}
Цитата Сообщение от ITcrusader Посмотреть сообщение
delete *this;
это удаление текущего узла
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.07.2013, 21:36     Правильно сделана перегруженная операция присваивания? #4
Признаться, я не совсем понимаю, что ты хочешь, чтобы делало присваивание. Со связями-то что, например?

Нененене, чего-то ты мудришь. Тут подходит для твоих нужд оператор присваивания по умолчанию.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.07.2013, 21:56  [ТС]     Правильно сделана перегруженная операция присваивания? #5
Сортировка списка не работает.
Вот программа





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
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
{
    ~TNode();
    TNode<T> *operator=(const TNode<T> *right);
 
    T value;                    // значение
    TNode<T> *ptrPrev;          // указатель на предыдущий узел
    TNode<T> *ptrNext;          // указатель на следующий узел
};
 
template<typename T>
TNode<T>::~TNode()
{
    delete this;
}
 
 
template<typename T>
TNode<T> *TNode<T>::operator=(const TNode<T> *right)
{
    delete *this;
    this=right;
    return this;
}
 
 
 
 
 
template<typename T>
class TCList
{
public:
 
    // сортировка узлов списка
    void TCList<T>::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>
void TCList<T>::Sort(TNode<T> *ptrBegin, TNode<T> *ptrEnd, bool (*ptrFunc)(const T &, const T &))
{
    TNode<T> *ptrTemp;
 
    for (TNode<T> *ptr1=mPtrBegin; ptr1->ptrNext!=NULL; ptr1=ptr1->ptrNext)
    {
        bool flag=false;
 
        for (TNode<T> *ptr2=mPtrBegin; ptr2!=NULL; ptr2=ptr2->ptrNext)
            if (!ptrFunc(ptr1->value, ptr2->value))
            {
                ptrTemp=ptr1;
                ptr1=ptr2;
                ptr2=ptrTemp;
 
                flag=true;
            }
 
        if (!flag) break;
    }
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    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;
 
    return 0;
}
Добавлено через 1 минуту
может поможете ее доделать, а то уже полдня с ней сижу


вот еще забыл функцию вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
Добавлено через 9 минут
Цитата Сообщение от ITcrusader Посмотреть сообщение
Признаться, я не совсем понимаю, что ты хочешь, чтобы делало присваивание.
один уэел присвоить другому. это для того, чтобы два узла в списке поменять местами
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.07.2013, 21:56     Правильно сделана перегруженная операция присваивания? #6
не все дал:
PushBack нету, например, выложи весь код повнимательнее?)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
24.07.2013, 22:01     Правильно сделана перегруженная операция присваивания? #7
Цитата Сообщение от BigLow Посмотреть сообщение
C++
1
2
3
4
5
template<typename T>
TNode<T>::~TNode()
{
    delete this;//!!!!!!!!!!!!!
}
//...
C++
1
2
3
4
5
6
7
template<typename T>
TNode<T> *TNode<T>::operator=(const TNode<T> *right)
{
    delete *this;//!!!!!!!!!!!!!!!
    this=right;//!!!!!!!!!!!!!
    return this;
}
Интересные строчки! И что они делают?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.07.2013, 22:02  [ТС]     Правильно сделана перегруженная операция присваивания? #8
извините, вот вроде вся

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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
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
{
    //~TNode();
    //TNode<T> *operator=(const TNode<T> *right);
 
    T value;                    // значение
    TNode<T> *ptrPrev;          // указатель на предыдущий узел
    TNode<T> *ptrNext;          // указатель на следующий узел
};
 
//template<typename T>
//TNode<T>::~TNode()
//{
//  delete this;
//}
 
 
//template<typename T>
//TNode<T> *TNode<T>::operator=(const TNode<T> *right)
//{
//  delete *this;
//  this=right;
//  return this;
//}
 
 
 
 
 
// список
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 TCList<T>::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()
{
    std::cout << "TCList<T>::TCList()" << std::endl;
 
    mPtrBegin = mPtrEnd = NULL;
    mTotalNodes = 0;
}
 
template<typename T>
TCList<T>::~TCList()
{
    std::cout << "TCList<T>::~TCList()" << std::endl;
    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>
bool TCList<T>::IsMinToMax(const T &a, const T &b)      { return a<b; }
 
template<typename T>
bool TCList<T>::IsMaxToMin(const T &a, const T &b)      { return b<a; }
 
template<typename T>
void TCList<T>::Sort(TNode<T> *ptrBegin, TNode<T> *ptrEnd, bool (*ptrFunc)(const T &, const T &))
{
    TNode<T> *ptrTemp;
 
    for (TNode<T> *ptr1=mPtrBegin; ptr1->ptrNext!=NULL; ptr1=ptr1->ptrNext)
    {
        bool flag=false;
 
        for (TNode<T> *ptr2=mPtrBegin; ptr2!=NULL; ptr2=ptr2->ptrNext)
            if (!ptrFunc(ptr1->value, ptr2->value))
            {
                ptrTemp=ptr1;
                ptr1=ptr2;
                ptr2=ptrTemp;
 
                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;
}
 
 
 
 
 
 
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    TCList<int>     listInt;
    //bool (*ptrFunc)(const int &, const int &) = IsMinToMax;
 
    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;
 
        
    system("pause");
    return 0;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2013, 22:06     Правильно сделана перегруженная операция присваивания? #9
Цитата Сообщение от BigLow Посмотреть сообщение
delete *this;
delete можно применять к объектам если они умеют кастоваться в указатели

Добавлено через 2 минуты
Цитата Сообщение от BigLow Посмотреть сообщение
C++
1
2
3
4
5
template<typename T>
TNode<T>::~TNode()
{
* * delete this;
}
кагбе delete это сигнал что пора вызвать деструктор и освободить память...рекурсия однако
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.07.2013, 22:21  [ТС]     Правильно сделана перегруженная операция присваивания? #10
Цитата Сообщение от Jupiter Посмотреть сообщение
кагбе delete это сигнал что пора вызвать деструктор и освободить память...рекурсия однако
да, я уже это понял и закомментировал эти строчки

Добавлено через 2 минуты
Как вообще поменять два узла местами? у меня не получается

Добавлено через 10 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Интересные строчки! И что они делают?
думал, что таким способом можно удалить текущий объект
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2013, 22:33     Правильно сделана перегруженная операция присваивания? #11
Цитата Сообщение от BigLow Посмотреть сообщение
думал, что таким способом можно удалить текущий объект
это не вкладывается в ООП. нельзя так просто взять и заменить один объект другим. можно изменить объект, клонировать,... но не заменить.

Добавлено через 9 минут
вот красивый пример двусвязного списка со всеми прелестями ООП
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
25.07.2013, 09:20  [ТС]     Правильно сделана перегруженная операция присваивания? #12
Цитата Сообщение от 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;
}
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
25.07.2013, 14:20     Правильно сделана перегруженная операция присваивания? #13
Цитата Сообщение от BigLow Посмотреть сообщение
доделал эту программу. когда меняю местами два узла, то сами узлы не трогаю, а изменяю только значения T value;
У нас однажды была лабораторная, связанная со списками и задание: удалить из списка все звенья, не удовлетворяющие критерию, не суть важно какому. Так мой одногруппник что сделал, заколебавшись бороться со связями и т.д.: он организовал цикл по всему списку и выводил на печать значения только тех звеньев, которые заданному критерию удовлетворяли. Это "потрясное" решение проблемы останется в наших с пацанами сердцах навсегда))))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 14:24     Правильно сделана перегруженная операция присваивания?
Еще ссылки по теме:

операция присваивания C++
C++ Перегруженная операция умножения * (матрица * число)
C++ Операция присваивания (=)

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 14:24     Правильно сделана перегруженная операция присваивания? #14
Ну да, копирование объектов может быть более затратно, чем перестановка связей. К тому же, необходимо чтобы был доступен оператор присваивания для объекта.
Yandex
Объявления
25.07.2013, 14:24     Правильно сделана перегруженная операция присваивания?
Ответ Создать тему
Опции темы

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