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

Двухсвязный список и оператор [] - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Процедуры и функции http://www.cyberforum.ru/cpp-beginners/thread349865.html
Сформировать матрицу C(5,5) элементы которой являются значениями определенного интеграла: C(I,J)=(i+j)/20 - верхний предел I/20 -нижний предел f(x)dx Алгоритмы выполнения функциональных задач:...
C++ Поиск всех файлов Здравствуйте Задача кода найти все файлы в папке,для их дальнейшего использования Код такой: #define _WIN32_WINNT 0x0400 #include <windows.h> #include <string.h> #include <stdio.h> using... http://www.cyberforum.ru/cpp-beginners/thread349843.html
C++ Как разбить массив на 5 частей по 4 символа (бита)?
Здравствуйте! Подскажите, пожалуйста, как разбить массив на 5 частей по 4 символа (бита). Получается, вывести только первых четыре массива. Нужно сделать цикл в цикле или временный цикл для...
массив C++
Требуется подсчитать максимальное количество неубывающих подряд идущих элементов массива. #include <iostream> using namespace std; void main() { const n=10; int a,i,max=1,k=1;...
C++ Prevent SuspendThread() & TerminateThread() http://www.cyberforum.ru/cpp-beginners/thread349830.html
Доброго времени суток, возникла проблема, я пишу Анти-Чит для онлайн игры, анти-чит работает нормально, но есть уязвимость, можно заморозить поток - SuspendThread или убить его TerminateThread и...
C++ Возведение матрицы в куб Дали задание, написать программу, которая возводит матрицу в куб. #include "stdafx.h" #include <stdlib.h> #include <iostream> #include <Windows.h> using namespace std; int main() { подробнее

Показать сообщение отдельно
DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99

Двухсвязный список и оператор [] - C++

10.09.2011, 01:35. Просмотров 497. Ответов 6
Метки (Все метки)

Здравствуйте!
Очень нужна помощь, так как 4 часа поисков в интернете не дали конкретных результатов.
Я в целях обучения/тренировки пытаюсь создать шаблонный класс, который бы реализовывал бы подобие массива при помощи двухсвязного линейного списка.
Проблема возникла на моменте перегрузки оператора []. Он прекрасно работает по принципу get метода индексаторов из C#, но ругается при попытках использовать его для установки значения.
Помогите, пожалуйста, разобраться в чем ошибка и как ее правильно решить.

Вот исходники:
inc.h
C++
1
2
3
#pragma once
#include <iostream>
using namespace std;
dwList.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
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
#pragma once
namespace DW {
 
/* ----------- ОБЬЯВЛЕНИЕ ----------- */
 
template <typename T>
struct Member {
 Member* prev;
 Member* next;
 T value;
};
 
template <typename T>
class dwList {
private:
 Member<T>* start;
 Member<T>* finish;
 
 int length;
 
private:
 Member<T>* NewMember(T value);
 void DeleteByIndex(int index);
 
public:
 dwList();
 ~dwList();
 
public:
 T &operator[] (unsigned int n);
 int Length() const;
 void Clear();
 
 void Append(T value);
};
 
 
 
 
 
 
/* ----------- РЕАЛИЗАЦИЯ ----------- */
 
 
// конструктор
template <typename T>
dwList<T>::dwList() {
 start = NULL;
 finish = NULL;
 
 length = 0;
}
 
 
// деструктор
template <typename T>
dwList<T>::~dwList() {
 Clear();
}
 
 
// вернуть длинну списка
template <typename T>
int dwList<T>::Length() const {
 return length;
}
 
 
// создание нового узла списка
template <typename T>
Member<T>* dwList<T>::NewMember(T value){
 Member<T>* element = new Member<T>;
 element -> prev = NULL;
 element -> next = NULL;
 element -> value = value;
 return element;
}
 
 
// удалить элемент по индексу
template <typename T>
void dwList<T>::DeleteByIndex(int index){
 if (index < 0 || index > length -1) return;
 
 /*
  TODO:
  Обработка: от конца или от начала считать.
  Обработка 2: идти от передвижного указателя
 */
 
 Member<T>* tmp = start;
 int i = 0;
 while (i != index) {
  tmp = tmp -> next;
  i++;
 }
 
 if (tmp == start) start = tmp -> next;
 else if (tmp == finish) finish = tmp -> prev;
 
 if (tmp -> prev != null) tmp -> prev -> next = tmp -> next;
 if (tmp -> next != null) tmp -> next -> prev = tmp -> prev;
 
 /*
  TODO:
  Обработка передвижного указателя: перемещение, изменение индекса
 */
 
 delete tmp;
 length--;
}
 
 
// очистить список
template <typename T>
void dwList<T>::Clear() {
 if (length == 0) return;
 
 Member<T>* tmp = finish;
 while (tmp != NULL) {
  finish = tmp -> prev;
  delete tmp;
  tmp = finish;
 }
 delete tmp;
 start = NULL;
 finish = NULL;
 length = 0;
}
 
 
// добавить элемент в конец списка
template <typename T>
void dwList<T>::Append(T value) {
 Member<T>* newNode = NewMember(value);
 if (start == NULL) {
  start = newNode;
  finish = newNode;
 } else {
  newNode -> prev = finish;
  finish -> next = newNode;
  finish = newNode;
 }
 length++;
}
 
template <typename T>
T &dwList<T>::operator[] (unsigned int n) {
 if (n >= length) return NULL;
 
 int index = 0;
 Member<T>* node = start;
 while (index != n) {
  node = node -> next;
  index++;
 }
 
 return node -> value;
}
 
}
entryPoint.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "inc.h"
#include "dwList.h"
using namespace DW;
 
void main() {
 dwList<int> test;
 test.Append(1);
 test.Append(2);
 cout << test.Length() << endl;
 cout << test[0] << endl;
 test[0] = 3;
 cout << test[0] << endl;
}
P.S.: До этого ни разу с шаблонами не работал и такого рода перегрузки не делал.
Вот что выдает MS Visual Studio 2010 при попытке скомпилировать этот код:
dwlist.h(149): error C2440: 'return' : cannot convert from 'int' to 'int &'

Как get работает если убрать амперсанд перед operator
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru