Können Sie mir erklären, warum das friend
Schlüsselwort bevorzugt wird, um Zugriffsrechte auf private Daten der Klasse zu gewähren?
Können Sie mir erklären, warum das friend
Schlüsselwort bevorzugt wird, um Zugriffsrechte auf private Daten der Klasse zu gewähren?
Antworten:
Freund ist die klassische Art, die Schnittstelle einer Klasse zu erweitern.
Aber das Tolle ist, dass ein Freund ausdrücklich Ihre Absicht dokumentiert, bestimmte Gegenstände fest an eine Klasse zu binden.
Hinweis: Wenn Sie einen Freund verwenden, binden Sie die Freunde eng an die Klasse.
Ein perfektes Beispiel sind die Stream-Operatoren in C ++
class Plop
{
private:
int value;
friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
friend std::istream& operator>>(std::istream& stream, Plop& data);
};
std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop& data)
{
return stream >> data.value;
}
Hier erweitern wir die öffentliche Schnittstelle der Plop-Klasse so, dass wir das Objekt in einen Stream hinein und aus diesem heraus streamen können, ohne jedoch die interne Implementierung offen zu legen oder zukünftige Implementierungsprobleme zu verursachen, indem wir die Verwendung von get / set-Methoden erfordern, die erforderlich sind beibehalten werden (weil sie Teil der öffentlichen Schnittstelle wären), auch wenn die interne Implementierung geändert wird.
Hinweis: Dadurch wird die Kapselung NICHT unterbrochen, die Stream-Operatoren werden jedoch eng an die Implementierung der Plop-Klasse gebunden (dh jede Änderung an der Implementierung der Plop-Klasse erfordert eine Änderung an der Implementierung der Stream-Operatoren). Dies wird aber erwartet. Alle Teile der öffentlichen Schnittstelle (einschließlich öffentlicher / geschützter Methoden) sind eng an die Implementierung gebunden.
Hinweis: Sie haben diese Bindung im Rahmen der Klassendeklaration explizit dokumentiert.
Hinweis: Ich würde Freund nicht als bevorzugte Methode zum Offenlegen privater Daten bezeichnen. Übermäßiger Gebrauch von Freunden kann genauso schlimm sein wie das Aufdecken der Implementierung. Wie alle Sprachfunktionen sollte es mit Bedacht verwendet werden.
friend
, welche anderen Möglichkeiten verwenden Sie normalerweise, um von außen auf private Klassendaten zuzugreifen?