Nel mio lavoro giorno per giorno, mi ritrovo spesso a scrivere classi come in questo esempio semplificato:Class - come fornire accesso in sola lettura al contenitore di membro della classe
class CGarage
{
public:
CGarage();
~CGarage();
typedef std::vector<Car> CarCollection;
private:
CarCollection m_Cars;
};
voglio gli utenti del CGarage per avere accesso in sola lettura a CarCollection. Al fine di raggiungere tale obiettivo, quelli sono alcune soluzioni comuni che non sono tutte molto soddisfacenti:
Soluzione 1
class CGarage
{
Car GetCar(CarCollection::size_type index) const;
CarCollection::size_type CarCount() const;
};
svantaggio principale:
- Mancando iteratori, non posso utilizzare gli algoritmi STL su Cars (ad es. for_each (...))
Solut ione 2
class CGarage
{
CarCollection::const_iterator CarBegin() const;
CarCollection::const_iterator CarEnd() const;
CarCollection::size_type CarCount() const;
};
svantaggio principale:
- Un sacco di codice boilerplate se avete bisogno di supporto per altri tipi di iteratori (che, reverse_it).
Soluzione 3
class CGarage
{
const CarCollection GetCars() const;
};
svantaggio principale:
- costo di copiare CarCollection al ritorno per valore
- dettagli di implementazione noti agli utenti della classe (ad esempio, non può cambiare per std :: lista senza modifica del codice utente di rottura)
Soluzione 4
class CGarage
{
const CarCollection& GetCars() const;
};
svantaggio principale:
- vita di riferimento CarCollection legata alla vita di CGarage dettagli
- implementazione noti agli utenti della classe
Domande
Come si dovrebbero fornire accesso in sola lettura al CarCollection?
La soluzione cambia, se CarCollection è un vettore con indicazioni per Car?
Se si consente l'accesso in lettura e scrittura alla raccolta, è accettabile rendere pubblica la raccolta?
Grazie per qualsiasi consiglio
Peter, grazie per la tua risposta dettagliata. Una domanda: usare la soluzione 4 e un contenitore std :: vector. Come si evita all'utente di cambiare l'auto (ha puntatori non costanti alle macchine reali, quindi può cambiarle)? –
nabulke
In questo caso è necessario utilizzare qualcosa come boost 'ptr_vector' (http://www.boost.org/doc/libs/1_45_0/libs/ptr_container/doc/ptr_vector.html), vedere anche (http: // www .codeproject.com/KB/stl/ptr_vecto.aspx) –