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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MrLinch
12 / 10 / 6
Регистрация: 23.12.2012
Сообщений: 51
#1

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

16.06.2013, 16:38. Просмотров 553. Ответов 3
Метки нет (Все метки)

Добрый день! Пишу сейчас одну библиотеку (не использующею 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.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 16:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Собственный класс итератора (C++):

Класс контейнера и итератора - C++
Товарищи программисты. Помогите выяснить что должен делать в данной задаче итератор. Реализовать шаблон класса vector, реализующий...

Класс итератора для класса вектора - C++
Необходимо реализовать собственный класс итератора для прохода по вектору, с перегрузкой оператора ++ - переход к следующему элементу и --...

STL и собственный класс - C++
Подскажите, пожалуйста, как можно переопределить функцию STL для собственного класса. Например, push_front() или push_back() не работают...

Собственный класс-итератор - C++
Создаю класс-итератор для класса Студенты. Сам класс студенты: #ifndef STUDENTS_H #define STUDENTS_H #include &lt;string&gt; ...

Реализуйте собственный класс строки - C++
Задание: Строка Реализуйте собственный класс строки для использования в языке C++. Класс должен поддерживать наиболее часто...

Map и собственный класс: GCC ругается - C++
Что я делаю не так? Мэйн: int main() { string s = &quot;abc&quot;; map&lt;string, ConfigSection&gt; sectionList; sectionList =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.06.2013, 16:42 #2
Цитата Сообщение от MrLinch Посмотреть сообщение
typedef T reference; //!< Ccылка на значение
амперсанд пропущен
1
MrLinch
12 / 10 / 6
Регистрация: 23.12.2012
Сообщений: 51
16.06.2013, 16:47  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
амперсанд пропущен
Вот Я блин... Спасибо огромное...
0
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ылка на значение
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 16:48
Привет! Вот еще темы с ответами:

Вывод двумерного массива используя собственный класс - C++
Доброго времени суток! дайте совет что не так сделал. нужно вывести двумерный массив с помощью класса: #include &quot;stdafx.h&quot; ...

Exception Handling. Собственный класс для перехвата исключений - C++
Помогите, пожалуйста, с данной задачей. Задача: Define an exception class called tornadoException. The class should have two...

Написать собственный класс для ввода и вывода строки, подсчета количества символов в строке - C++
как написать собственный с++ класс для ввода и вывода строки, подсчета количества символов в строке

Как использовать собственный класс в структуре struct до определения самого класса в тексте программы - C++
Проблема такая: хочу в структуре одним из элементов сделать класс. Проблема в том, что эта структура задается в самом начале текста...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.06.2013, 16:48
Ответ Создать тему
Опции темы

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