Ich habe eine Klasse, die eine Liste von Personen darstellt.
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
Ich möchte Kunden erlauben, über den Vektor von Menschen zu iterieren. Der erste Gedanke, den ich hatte, war einfach:
std::vector<People> & getPeople { return people; }
Allerdings möchte ich nicht die Details der Implementierung an den Client lecken . Ich möchte möglicherweise bestimmte Invarianten beibehalten, wenn der Vektor geändert wird, und ich verliere die Kontrolle über diese Invarianten, wenn ich die Implementierung verliere.
Was ist der beste Weg, um die Iteration zuzulassen, ohne die Interna zu verlieren?
begin()
und end()
ist gefährlich, da (1) diese Typen Vektoriteratoren (Klassen) sind, die verhindern, dass einer zu einem anderen Container wie a wechselt set
. (2) Wenn der Vektor modifiziert wird (z. B. gewachsen oder einige Elemente gelöscht), könnten einige oder alle Vektoriteratoren ungültig gemacht worden sein.