Wofür wird das Schlüsselwort "Freund" verwendet?

11

Können Sie mir erklären, warum das friendSchlüsselwort bevorzugt wird, um Zugriffsrechte auf private Daten der Klasse zu gewähren?

Dalton
quelle
1
Wenn Sie nach dem Warum fragen friend, welche anderen Möglichkeiten verwenden Sie normalerweise, um von außen auf private Klassendaten zuzugreifen?
Benjamin Bannier
@honk "Bevorzugt" ist möglicherweise das falsche Wort. Ich habe den größten Teil des Beitrags bearbeitet, um Grammatik und so weiter zu korrigieren, und ich habe die ursprüngliche Wortwahl beibehalten, aber ich denke, dass es hier möglicherweise eine Sprachbarriere gibt.
Adam Lear
Ich weiß es nicht, weil ich heute zufällig über Freunde gelesen habe. und der Artikel sagt, wenn ich keinen Freund benutze, werde ich eine Monolit-Klasse erstellen.
Dalton

Antworten:

17

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.

Martin York
quelle
Wenn Sie öffentlich auf die Daten zugreifen könnten (z. B. über einen Getter), hätten Sie stattdessen eine kostenlose Funktion verwendet?
Ioanna