Может ли тип 'iterator' просто подкласс 'const_iterator'? - PullRequest
15 голосов
/ 16 мая 2010

После еще один вопрос об итераторах У меня есть некоторые сомнения по поводу пользовательских контейнеров. В моем контейнере iterator является подклассом const_iterator, так что я получаю преобразование из non-const в const "бесплатно". Но разрешено ли это или есть какие-то недостатки или нерабочие сценарии для такой установки?

Ответы [ 3 ]

7 голосов
/ 16 мая 2010

Да, это нормально. Так, например, структурирована реализация итераторов для vector в VC10. См _Vector_iterator и _Vector_const_iterator в <vector>.

Кстати, писать итераторы сложно. Стоит потратить время на изучение и использование библиотеки boost :: iterator.

2 голосов
/ 17 мая 2010

Подклассы здесь кажутся мне странными, но на самом деле есть проблема.

Даже если вы не хотите зависеть от частей Boost, проверьте библиотеку Boost.Iterator и, в особенности, iterator_facade и iterator_adaptor биты.

Существует полный пример того, как написать iterator и const_iterator для вашего класса, не дублируя слишком много. Их идея состоит в том, чтобы написать шаблон iterator_base класса, который затем можно использовать для константных и неконстантных типов в строке:

template <class Value> class iterator_base;

typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;

Проблема с подклассами заключается в том, что вам следует предоставить виртуальный деструктор, и вы подвергаетесь нарезке (при создании const_iterator из iterator)

Так что, в отличие от других здесь, я не нахожу это "хорошо".

0 голосов
/ 16 мая 2010

Подумайте о случае, который потребует от вас изменения членов итератора.

...