Private/protected member einer nested class für abgeleitete Klassen sichtbar machen
-
Hallo, ich habe eine Klasse Liste und darin eine public Klasse Iterator. Diese nested class nun hat aber ein Datenelement, welches von außen nicht zugänglich sein soll. Jedoch wird der Zugriff darauf von Klassen, welche von Liste abgeleitet sind, benötigt. Ich kann dieses Datenelement aber nicht als public definieren, weil es dann ja auch nach außen sichtbar wäre. Als private oder protected ist es nun aber von von Liste abgeleiteten Klassen nicht zugänglich, da diese ja nicht von Iterator abgeleitet sind.
Nun habe ich die zwei Möglichkeiten gefunden, endweder alle abgeleiteten Klassen als friend von Iterator zu definieren oder in Liste eine protected static Getter Function für dieses Datenelement zu schreiben.
Beide Möglichkeiten gefallen mir jedoch nicht wirklich, da die Friends ja für jede neue Klasse erweitert werden müssen und der Getter eigendlich eine überflüssige Funktion ist.Gibt es da Alternativen?
Danke schon mal im Voraus, Niko
-
another level of indirection
class List { public: class Iterator { int privateData_; friend class InternalIterator } protected: class InternalIterator { Iterator& itor_; public: InternalIterator( const Iterator& itor) :itor_( itor); setPrivateData(...) { itor_.privateData_ = ...; } } }
Prinzipiell:
Mache keine Daten-Members öffentlich!!!! Nie, niemals, nicht
Dein Ansatz mit dem setter in List ist von daher schon mal richtig.Nur gehört die Set-Methode halt nicht zur Liste sondern zum Iterator.
Mit InternalIterator steht jetzt jeder von List abgeleitete Klasse ein umfangreicheres Interface von Iterator zur Verfügung als anderen Klassen. Und das ist das was Du brauchst - wenn Du darauf verzichtest, auf Datenmembers zuzugreifen (das Könntest Du mit referenzen in InternalIterator auf Datenmembers von Iterator machen. Aber wie gesagt, sollte man das nicht machen.
-
Danke für die schnelle Antwort,
ich habe da jedoch noch eine Frage.
Einige Methoden einer von Liste abgeleiteten Klasse bekommen als Parameter einen Iterator und müssen auf dem seine privaten Member zugreifen.
Da müsste ich dann ja aus dem übergebenen Iterator einen InternalIterator konstruieren und dann über dessen Methoden auf die private-Member zugreifen.Läst sich dies umgehen?
Wenn nicht, inwieweit wirkt sich dies auf die Laufzeiteigenschaften aus?
Danke, Niko
-
So, wie InternalIterator dort vorgeschlagen ist, kannst du ihn bedenkenlos nutzen. Alle Memberfunktionen sind inline, und er speichert nur eine Referenz auf den eigentlichen Iterator, kopiert also auch nichts. Davon wird dein Compiler zumindest bei einem Release Build nichts mehr übrig lassen.
-
Ok, dann mach ich das so!
Danke!!!!Niko