2010-05-16 12 views

Respuesta

7

Sí, esto está bien. Así es como la implementación de VC10 de los iteradores para vector están estructurados, por ejemplo. Consulte _Vector_iterator y _Vector_const_iterator en <vector>.

Por cierto, escribir iteradores es difícil. Vale la pena el tiempo para aprender y usar la biblioteca boost :: iterator.

+0

Lo sé, pero en mi caso es una biblioteca pequeña y no quiero que dependa de nada, incluidas las partes de Boost. – doublep

+0

Ya es bueno que alguna implementación de STL funcione así. ¿Conoces una cláusula en el estándar que describe los iteradores y los requisitos en general? – doublep

+0

24.2 del FCD (n3035.pdf) describe los iteradores y sus requisitos –

0

Piense en un caso que será necesario que modificar los miembros del repetidor.

+4

Y? Supongo que debes elaborarlo. – doublep

2

Las subclases me parecen extrañas aquí, pero efectivamente hay un problema.

Incluso si no desea depender de las piezas Boost, consulte la biblioteca Boost.Iterator, y más especialmente los iterator_facade y iterator_adaptor bits.

Existe un completo ejemplo de cómo escribir un iterator y un const_iterator para su clase sin duplicar demasiado. Su idea es escribir un iterator_base clase de plantilla que luego se puede utilizar para la const y no const tipos en la línea de:

template <class Value> class iterator_base; 

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

El problema con la subclasificación es que a continuación, debe proporcionar un destructor virtual y que está expuesto a cortar (al construir un const_iterator desde un iterator)

Por lo tanto, a diferencia de otros aquí, no me parece "bien".

+2

"Debería proporcionar un destructor virtual", pero mis destructores no hacen nada de todos modos. Incluso si lo hicieran, el tipo 'iterator' probablemente heredará el destructor' const_iterator', sin hacer nada extra. "Estás expuesto a rebanar". ¿Puedes explicarme mejor? No entiendo lo que quieres decir aquí. – doublep

+1

Un ejemplo de segmentación, 'iterator it; const_iterator cit = static_cast (it); '. Aquí, cuando está asignando el tipo 'it' a' cit', cualquier variable adicional que haya agregado a 'it' está ** no ** copiada en' cit'. Pero creo que esto está bien, ya que nunca podemos bajar a 'iterator' de nuevo. – Hindol

Cuestiones relacionadas