Aquí hay una encapsulación bastante normal de un contenedor STL que permite al usuario de Cfoo iterar el contenedor sin permitir cambios en las entrañas.iteración de contenedores STL encapsulados encapsulados
#include <vector>
class Cfoo
{
public:
class Cbar
{
/* contents of Cbar */
};
typedef std::vector<Cbar> TbarVector;
typedef TbarVector::const_iterator const_iterator;
public:
const_iterator begin() const { return(barVector_.begin()); }
const_iterator end() const { return(barVector_.end()); }
private:
TbarVector barVector_;
};
Hasta ahora, muy bien. Podemos repetir el contenedor de la siguiente manera:
Cfoo myFoo;
for (Cfoo::const_iterator it = myFoo.begin(); it != myFoo.end(); ++it)
{
it->DoSomething();
}
Ahora quiero reemplazar el std :: vector con decir un std :: vector anidada:
public:
typedef std::vector<Cbar> TbarVectorInner;
typedef std::vector<TbarVectorInner> TbarVectorOuter;
private:
TbarVectorOuter barContainer_;
Pero yo quiero ser capaz de recorrer en iteración todas las instancias de Cbar de la misma manera que antes, exponiendo un const_iterator, y un método const() de const y un const() de const().
No tengo claro cómo hacerlo, aunque sospecho que implica escribir un iterador personalizado. ¿Alguna idea?
Implica escribir un iterador personalizado. –
Suena como el trabajo para Flattening Iterator de http://stackoverflow.com/questions/3623082/flattening-iterator – Cubbi
'TbarVector' debe ser privado, le dice al mundo exterior cosas que no son relevantes para él y es propenso al mal uso . –