Friend-Funktion

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


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • PERL — Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Perl (Programmiersprache) — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle Version …   Deutsch Wikipedia

  • Programmiersprache Perl — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Tim Towtdi — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Timtowtdi — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Tmtowtdi — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Wilhelm Reich — Born March 24, 1897(1897 03 24) Dobzau, Kingdom of Galicia and Lodomeria (present day Dobrzanica, Ukraine) …   Wikipedia

  • My Evolution — Origin Hollywood, California, United States, USA Genres Rock, Alternative Rock, Hard Rock Years active 2004 present Labels Independent Associated acts …   Wikipedia

  • Facebook — www.facebook.com Motto „Facebook ermöglicht es dir, mit den Menschen in deinem Leben in Verbindung zu treten und Inhalte …   Deutsch Wikipedia

  • Hildegard Hammerschmidt-Hummel — (born January 21, 1944) is a German Professor of English, literary critic, Shakespeare scholar and writer. Hildegard Hammerschmidt Hummel is regarded by many as a Shakespeare scholar who has won for herself a special standing within national and… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”