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

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

Войти
Регистрация
Восстановить пароль
 
Basie
1 / 1 / 0
Регистрация: 27.12.2012
Сообщений: 8
#1

Реализация энумератора - C++

28.12.2012, 00:00. Просмотров 368. Ответов 2
Метки нет (Все метки)

Пишу C++ аналог Enumerator'ов из .NET на основе стандартных итераторов. Сейчас интерфейс класса выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template < typename STLiterator >
class Enumerator {
public:
    Enumerator ( ) : _current(_end), _next(_end) { }
    Enumerator ( STLiterator begin, STLiterator end )
        : _current(begin), _next(begin), _end(end) { }
 
    bool operator ++ ( ) ; // Переход к следующему элементу
    ? operator * ( ); // Получение значения текущего элемента ("разыменование")
    ? operator -> ( ? ); // Доступ к членам элемента
 
private:
    STLiterator _current, _next, _end;
};
Класс должен работать с любыми классами, у которых есть обычный итератор (с операторами ++, *, ->) включая указатели.
Конструктор получает стандартные итераторы begin()/end() (или constBegin()/constEnd()), либо, в случае указателей, - начальное и конечное смещения.
Оператор ++ при вызове пытается сместиться к следующему элементу последовательности и, если это удалось, возвращает true, иначе (если дошли до конца) - false. Для доступа к самому первому элементу ++ тоже необходимо предварительно вызвать.
Операторы * и -> должны предоставлять доступ к значению текущего элемента и к его членам соответственно.
Вопрос: какими должны быть типы и параметры, вместо которых в интерфейсе стоят знаки вопроса? Как грамотно расставить const и & у этих типов?
P. S. Те, кому режет глаза перегрузка операторов ++ и *, могут в своём ответе использовать вместо них методы next и value с теми же параметрами/типом возвращаемого значения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 00:00     Реализация энумератора
Посмотрите здесь:

Реализация меню - C++
сейчас для переключения по пунктам меню надо вводить номер пункта меню, а надо чтоб курсором переключалось! вот код с обычным меню: do...

Реализация has_plus - C++
Подкиньте идею как правильно реализовать аналог boost::has_plus.#include &lt;iostream&gt; #include &lt;type_traits&gt; #include...

Реализация. Структуры - C++
Подскажите пожалуйста правильно ли реализовано? void zadanie24(){ struct pointer{ int *a; }; pointer *p1=new pointer; ...

Вектор реализация - C++
Ситуация такая мне нужно создать вектор игроки, каждый игрок внутри себя должен содержать вектор предметы. При по попытки создать вектор...

Реализация деревьев - C++
Я вот сделал простое дерево (максимально дочерних узлов в корне - 3). Теперь нужно доработать, чтобы были списки сыновей. Помогите...

Собственно реализация - C++
Помогите реальзовать программу... Нужно,при запуске был текст приветствия. После нужно ввести команду &quot;text1&quot; Появляется сообщение. ...

Реализация stack - C++
Задание реализовать stack, первым делом написал добавление элемента и показ всего stack, заполнив его цифрами от 0 до 9, но при показе...

Реализация QuickSort - C++
Ребят, есть нужда отсортировать массив структур по полю name (по алфавиту) реализовав алгоритм QuickSort. Написал вроде как черновой...

Реализация класса - C++
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для...

Реализация вектора - C++
Всем доброго времени суток. Я сегодня уже обращался за помощью к форумчанам, но костыли не дремлют... Проблема: Есть класс User....

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

Реализация memccpy - C++
#include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; #include&lt;windows.h&gt; void *mymemccpy(void...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.12.2012, 00:26     Реализация энумератора #2
Для -> надо возвращать STLiterator value type*.
Для * надо возвращать STLiterator value type&
По поводу константности - входящие итераторы могут быть как константными, так и не константными. Возможно, нужно несколько реализаций
Basie
1 / 1 / 0
Регистрация: 27.12.2012
Сообщений: 8
28.12.2012, 01:57  [ТС]     Реализация энумератора #3
A STLiterator value type нужно включить ещё одним параметром в шаблон?

И ещё: может быть можно как-то вывернуться и возвратить то, что возвращают соответствующие операторы STLiterator? Например вместо * и -> сделать оператор преобразования:
C++
1
2
3
operator const STLiterator & ( ) const {
    return _current;
}
и чтобы операции * и -> , применённые к энумератору, делегировались через это неявное преобразование к _current'у, но при этом защитить последний const'ами от несанкционированного изменения? (Но чтобы само значение, на которое указывает _current, можно было бы менять, если, конечно, он не const_iterator - поправьте, если const'ы стоят не так).
Ответ Создать тему
Опции темы

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