- Friend-Funktion
-
Unter einer Friend-Funktion oder Friend-Methode versteht man in der objektorientierten Programmierung eine Methode (also eine Funktion oder eine Prozedur), der man erlaubt, auf private oder geschützte Daten (private oder protected) einer anderen Klasse zuzugreifen, auf die sie sonst keinen Zugriff hätte.
Ein solcher Zugriff widerspricht dem Paradigma der Datenkapselung, kann aber unter Umständen trotzdem sinnvoll sein. Dann wird diese zugreifende Methode mit dem Schlüsselwort friend als ein „Freund“ der darauf zugegriffen Klasse deklariert. Sie hat dann Zugriff auf alle Informationen, die public, protected, oder private in dieser Klasse sind.
Diese Möglichkeit der Freundschaft sollte mit Bedacht genutzt werden, da dadurch die Datenkapselung abgeschwächt wird. Friend-Methoden sind ein Konzept der Programmiersprache C++. Jedoch gibt es ähnliche Möglichkeiten in anderen objektorientierten Programmiersprachen (z.b. internal in C#).
Inhaltsverzeichnis
Beispiele
In diesem Beispiel ist die Funktion show() ein Freund der Klasse A und B. Sie kann deshalb private Informationen dieser Klassen anzeigen.
// Beispiel 1 #include <iostream> using namespace std; // Vorausdeklaration der Klassen class A; class B; //Klasse A class A { private: int a; public: A() { a = 0; } friend void show(A& x, B& y); }; //Klasse B class B { private: int b; public: B() { b = 6; } friend void show(A& x, B& y); }; //Show Funktion void show(A& x, B& y) { cout << "A::a = " << x.a << endl; cout << "B::b = " << y.b << endl; } //Hauptfunktion int main() { A a; B b; show(a,b); return 0; }
Ohne das Konzept der Freundschaft müsste man eine eigene Funktion für beide Klassen schreiben, also zum Beispiel
// Beispiel 1 #include <iostream> using namespace std; // Vorausdeklaration der Klassen class A; class B; //Klasse A class A { private: int a; public: A() { a = 0; } void show(){cout << "a = " << x.a << endl;}; }; //Klasse B class B { private: int b; public: B() { b = 6; } void show(){cout << "b = " << x.b << endl;}; }; //Hauptfunktion int main() { A a; B b; a.show(); b.show(); return 0; }
Eine Methode kann auch mehrere Klassen als Freunde haben. Dies erlaubt zum Beispiel eine Funktion, die private Datenfelder zwei Objekte unterschiedlicher Klassen vertauschen kann// Eine swap Funktion, um private Daten zweier Klassen auszutauschen #include <iostream> using namespace std; // Vorausdeklaration der Klassen class A; class B; //Klasse A class A { private: int a; public: A() { a = 0; } void show(){cout << "a = " << x.a << endl;}; friend void swap(A& x, B& y); }; //Klasse B class B { private: int b; public: B() { b = 6; } void show(){cout << "b = " << x.b << endl;}; friend void swap(A& x, B& y); }; //Swap Funktion void swap(A& x, B& y) { int tmp = x.a; x.a = y.b; y.b = tmp; } //Hauptfunktion int main() { A a(100); B b(200); cout << "Vorher: " << endl; a.show(); b.show(); swap(a,b); cout << "Nachher: " << endl; a.show(); b.show(); return 0; }
Friend-Klasse
Anstelle einer Methode kann auch eine ganze Klasse als Freund einer anderen Klasse definiert werden. Dann kann jede Methode dieser Klasse auf alle privaten Informationen der anderen Klasse zugreifen.
// Beispiel für eine Friends Klasse #include <iostream> using namespace std; // Vorausdeklaration der Klassen class A; class B; //Klasse A class A { private: int a; public: A() { a = 0; } void show(){cout << "a = " << x.a << endl;}; friend class B; }; //Klasse B class B { private: int b; public: B() { b = 6; } void show(){cout << "b = " << x.b << endl;};}; void changeA(A &a){a.a = b;} }; //Swap Funktion void swap(A& x, B& y) { int tmp = x.a; x.a = y.b; y.b = tmp; } //Hauptfunktion int main() { A a(100); B b(200); cout << "Vorher: " << endl; a.show(); b.show(); b.changeA(a); cout << "Nachher: " << endl; a.show(); b.show(); return 0; }
Referenzen
- The C++ Programmierung Language by Bjarne Stroustrup
- An Introduction to Object-Oriented Programmierung in C++ von Graham M. Seed
Weblinks
- C++ friend function tutorial bei CoderSource.net
- C++ friendship and inheritance tutorial bei cplusplus.com
Kategorien:- Objektorientierte Programmierung
- Unterprogramme
Wikimedia Foundation.