En mi trabajo del día a día, a menudo me encuentro escribiendo clases como en este ejemplo simplificado:Clase - cómo proporcionar acceso de sólo lectura a un contenedor miembro de la clase
class CGarage
{
public:
CGarage();
~CGarage();
typedef std::vector<Car> CarCollection;
private:
CarCollection m_Cars;
};
Quiero que los usuarios de CGarage tiene acceso de solo lectura a CarCollection. Para lograr ese objetivo, esas son algunas de las soluciones comunes que todos no son muy satisfactorios:
Solución 1
class CGarage
{
Car GetCar(CarCollection::size_type index) const;
CarCollection::size_type CarCount() const;
};
desventaja principal:
- falta de iteradores, no puedo utilizar algoritmos STL en automóviles (p. ej. for_each (...))
Solut ión 2
class CGarage
{
CarCollection::const_iterator CarBegin() const;
CarCollection::const_iterator CarEnd() const;
CarCollection::size_type CarCount() const;
};
desventaja principal:
- Una gran cantidad de código repetitivo, si necesita asistencia para otros tipos de iterador (it, reverse_it).
Solución 3
class CGarage
{
const CarCollection GetCars() const;
};
desventaja principal:
- costo de copiar CarCollection al regresar por el valor
- detalles de implementación conocidas por los usuarios de la clase (por ejemplo, no puede cambiar std :: list sin cambiar el código de usuario)
Solución 4
class CGarage
{
const CarCollection& GetCars() const;
};
desventaja principal:
- vida útil de referencia CarCollection con destino a tiempo de vida de CGarage detalles
- de implementación conocidas por los usuarios de la clase
Preguntas
¿Cómo proporcionaría acceso de solo lectura al CarCollection?
¿Su solución cambia, si CarCollection es un vector con punteros al coche?
Si permite el acceso de lectura y escritura a la colección, ¿es aceptable hacer que la colección sea pública?
Gracias por cualquier consejo
Peter, gracias por su respuesta detallada. Una pregunta: usando solución 4 y un contenedor std :: vector. ¿Cómo evitas que el usuario cambie los automóviles (él tiene punteros que no son const para los autos reales, así que puede cambiarlos)? –
nabulke
En ese caso, necesitas usar algo como boost 'ptr_vector' (http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_vector.html), ver también (http: // www .codeproject.com/KB/stl/ptr_vecto.aspx) –