Tengo una clase que incluye una lista std :: y deseo proporcionar public begin() y end() para const_iterator y private begin() y end() para simplemente iterator.¿Cómo proporcionar stl like container con const iterator público e iterador privado sin const?
Sin embargo, el compilador ve la versión privada y se queja de que es privada en lugar de usar la versión pública de const.
Entiendo que C++ no se sobrecargará en el tipo de devolución (en este caso, const_iterator e iterador) y, por lo tanto, está eligiendo la versión no const ya que mi objeto no es const.
A falta de enviar mi objeto a const antes de llamar a begin() o no sobrecargar el nombre ¿hay alguna manera de lograr esto?
Creo que este es un patrón conocido que la gente ha resuelto antes y me gustaría seguir el ejemplo de cómo esto se resuelve normalmente.
class myObject {
public:
void doSomethingConst() const;
};
class myContainer {
public:
typedef std::list<myObject>::const_iterator const_iterator;
private:
typedef std::list<myObject>::iterator iterator;
public:
const_iterator begin() const { return _data.begin(); }
const_iterator end() const { return _data.end(); }
void reorder();
private:
iterator begin() { return _data.begin(); }
iterator end() { return _data.end(); }
private:
std::list<myObject> _data;
};
void myFunction(myContainer &container) {
myContainer::const_iterator itr = container.begin();
myContainer::const_iterator endItr = container.end();
for (; itr != endItr; ++itr) {
const myObject &item = *itr;
item.doSomethingConst();
}
container.reorder(); // Do something non-const on container itself.
}
El error del compilador es algo como esto:
../../src/example.h:447: error: `std::_List_iterator<myObject> myContainer::begin()' is private
caller.cpp:2393: error: within this context
../../src/example.h:450: error: `std::_List_iterator<myObject> myContainer::end()' is private
caller.cpp:2394: error: within this context
Gracias.
William
Por lo que veo no hay herencia en su código, probablemente debería corregir el 'Estoy derivando una clase de forma privada'. –
Vaya, las ediciones se han desincronizado, gracias por señalarlo, ahora se corrige. – WilliamKF
Si su inicio y fin no const son privados para su contenedor, ¿por qué desea proporcionarles funciones privadas? ¿Por qué no usar los iteradores de listas directamente? – AraK