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

Собственный класс итератора - C++

Восстановить пароль Регистрация
 
MrLinch
 Аватар для MrLinch
12 / 10 / 6
Регистрация: 23.12.2012
Сообщений: 51
16.06.2013, 16:38     Собственный класс итератора #1
Добрый день! Пишу сейчас одну библиотеку (не использующею STL и другие библиотеки) и для контейнеров решил написать класс итератора:
Кликните здесь для просмотра всего текста

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
/// Представляет поэлементный доступ к элементам коллекции
/// @param T - тип элементов коллекции
template<typename T>
class Iterator {
public:
    typedef T* pointer;          //!< Указатель на значение
    typedef T reference;         //!< Ccылка на значение
    typedef T value_type;        //!< Предопределенный тип для T
    typedef matx::size_t dist_t; //!< Тип для представления расстояния между итераторами
 
    Iterator();        //!< Конструктор по умолчанию
    Iterator(pointer); //!< Конструктор с параметром
    Iterator(const Iterator&); //!< Конструктор копий
 
    Iterator& operator = (const Iterator &);        //!< Оператор присваивания
 
    bool      operator == (const Iterator &) const; //!< Оператор сравнения
    bool      operator != (const Iterator &) const; //!< Оператор не-сравнения
 
    reference operator *  () const; //!< Разыменование итератора
    pointer   operator -> () const; //!< Косвенное обращение
    /// @bug only prefix
    Iterator& operator ++ ();    //!< prefix-incerment
    //Iterator& operator ++ (int); //!< postfix-incerment
    Iterator& operator -- ();    //!< prefix-decerment
    //Iterator& operator -- (int); //!< postfix-decerment
 
    Iterator  operator +  (const dist_t) const; //!< Плюс число
    Iterator  operator -  (const dist_t) const; //!< Минус число
    dist_t    operator -  (const Iterator&) const; //!< Расстояние до другого указателя
 
    bool      operator <  (const Iterator&) const; //!< bool, если этот указатель имеет адрес меньше чем второй
    bool      operator <= (const Iterator&) const; //!< bool, если этот указатель имеет адрес меньше чем второй, или они равны
    bool      operator >  (const Iterator&) const; //!< bool, если этот указатель имеет адрес больше чем второй
    bool      operator >= (const Iterator&) const; //!< bool, если этот указатель имеет адрес больше чем второй, или они равны
 
    Iterator& operator += (const dist_t); //!< Увеличить адрес текущего вектора
    Iterator& operator -= (const dist_t); //!< Уменьшить адрес текущего вектора
 
    reference operator [] (const dist_t) const; //!< Поэлементный доступ
protected:
    pointer ptr;       //!< C-like указатель
};
 
template<typename T>
Iterator<T>::Iterator() {
    ptr = 0;
}
 
template<typename T>
Iterator<T>::Iterator(pointer ptrToElement) {
    ptr = ptrToElement;
}
 
template<typename T>
Iterator<T>::Iterator(const Iterator<T> &it) {
    ptr = it.ptr;
}
 
template<typename T>
Iterator<T>& Iterator<T>::operator = (const Iterator<T> &it) {
    ptr = it.ptr;
    return *this;
}
 
template<typename T>
bool Iterator<T>::operator == (const Iterator<T> &it) const {
    return (ptr == it.ptr);
}
 
template<typename T>
bool Iterator<T>::operator != (const Iterator<T> &it) const {
    return not(ptr == it.ptr);
}
 
template<typename T>
typename Iterator<T>::reference Iterator<T>::operator * () const {
    return *ptr;
}
 
template<typename T>
typename Iterator<T>::pointer Iterator<T>::operator -> () const {
    return &*ptr;
}
 
template<typename T>
Iterator<T>& Iterator<T>::operator ++ () {
    Iterator tmp(*this);
    ptr++;
    return *this;
}
 
//template<typename T>
//Iterator<T>& Iterator<T>::operator ++ (int) {
//  ptr++;
//  return *this;
//}
 
template<typename T>
Iterator<T>& Iterator<T>::operator -- () {
    ptr--;
    return *this;
}
 
//template<typename T>
//Iterator<T>& Iterator<T>::operator -- (int) {
//  ptr--;
//  return *this;
//}
 
template<typename T>
Iterator<T> Iterator<T>::operator + (const dist_t n) const {
    return Iterator<T>(ptr + n);
}
 
template<typename T>
Iterator<T> Iterator<T>::operator - (const dist_t n) const {
    return Iterator<T>(ptr - n);
}
 
template<typename T>
typename Iterator<T>::dist_t Iterator<T>::operator - (const Iterator<T> &it) const {
    return ptr - it.ptr;
}
 
template<typename T>
bool Iterator<T>::operator < (const Iterator<T> &it) const {
    return (ptr < it.ptr);
}
 
template<typename T>
bool Iterator<T>::operator <= (const Iterator<T> &it) const {
    return (ptr < it.ptr) or (ptr == it.ptr);
}
 
 
template<typename T>
bool Iterator<T>::operator > (const Iterator<T> &it) const {
    return (ptr > it.ptr);
}
 
template<typename T>
bool Iterator<T>::operator >= (const Iterator<T> &it) const {
    return (ptr > it.ptr) or (ptr == it.ptr);
}
 
template<typename T>
Iterator<T>& Iterator<T>::operator += (const dist_t n) {
    ptr += n;
    return *this;
}
 
template<typename T>
Iterator<T>& Iterator<T>::operator -= (const dist_t n) {
    ptr -= n;
    return *this;
}
 
template<typename T>
typename Iterator<T>::reference Iterator<T>::operator [] (const dist_t index) const {
    return *(ptr + index);
}


Все вроде более менее работает, вот только ошибка в такой конструкции:
C++
1
2
3
4
// Написано для примера так я его использовать точно не буду :)
int array[10];
Iterator<int> i = array;
*i = 10;
выскакивает "ошибка: lvalue required as left operand of assignment", компилятор GCC.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.06.2013, 16:42     Собственный класс итератора #2
Цитата Сообщение от MrLinch Посмотреть сообщение
typedef T reference; //!< Ccылка на значение
амперсанд пропущен
MrLinch
 Аватар для MrLinch
12 / 10 / 6
Регистрация: 23.12.2012
Сообщений: 51
16.06.2013, 16:47  [ТС]     Собственный класс итератора #3
Цитата Сообщение от Jupiter Посмотреть сообщение
амперсанд пропущен
Вот Я блин... Спасибо огромное...
ksandro
31 / 31 / 1
Регистрация: 15.04.2011
Сообщений: 81
16.06.2013, 16:48     Собственный класс итератора #4
ошибка потому что reference у тебя определено не как ссылка. Поэтому оператор * возвращает результат по значению,

C++
1
2
    
typedef T reference;         //!< Ccылка на значение
должно быть:
C++
1
2
   
typedef T& reference;         //!< Ccылка на значение
Yandex
Объявления
16.06.2013, 16:48     Собственный класс итератора
Ответ Создать тему
Опции темы

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