C++-Programmierung/ Eigene Datentypen definieren/ Freunde
Aus Wikibooks
[Bearbeiten] Freundschaft unter Klassen
Klassen können andere Klassen als Freunde betrachten. Wie im echten Leben sind diese Betrachtungen nicht immer beidseitig. Grundsätzlich gilt: Wenn eine Klasse eine andere Klasse als Freund betrachtet, darf diese Freund-Klasse auf die privaten Inhalte der Klasse zugreifen.
class Seite
{
friend class Buch;
unsigned int m_nRevision; // implizit privat
};
class Buch
{
public:
Seite s19;
void jetzt_testen(void)
{
test();
}
private:
void test(void)
{
s19.m_nRevision = 1;
}
};
{
friend class Buch;
unsigned int m_nRevision; // implizit privat
};
class Buch
{
public:
Seite s19;
void jetzt_testen(void)
{
test();
}
private:
void test(void)
{
s19.m_nRevision = 1;
}
};
In diesem Beispiel sieht man eine solche Beziehung.
- Buch darf auf die private Variable m_nRevision zugreifen.
- Ein direkter Zugriff auf Seite::m_nRevision ist sogar nur von Buch aus möglich.
- Die Methode Buch::test kann niemals direkt aufgerufen werden.
Folgende Verwendung dieser Klassen schlägt fehl:
int main()
{
Buch dasBuch;
dasBuch.s19.m_nRevision = 9; // Kein Zugriff auf private Mitgliedsvariable von Seite
return 0;
}
{
Buch dasBuch;
dasBuch.s19.m_nRevision = 9; // Kein Zugriff auf private Mitgliedsvariable von Seite
return 0;
}
class freundlich
{
friend class Seite;
public:
static void Seite_Rev_Setzen(Seite & s, unsigned int nRev)
{
s.m_nRevision = nRev; // Kein Zugriff auf private Mitgliedsvariable von Seite
}
};
int main()
{
Seite dieSeite;
freundlich::Seite_Rev_Setzen(dieSeite, 123);
return 0;
}
{
friend class Seite;
public:
static void Seite_Rev_Setzen(Seite & s, unsigned int nRev)
{
s.m_nRevision = nRev; // Kein Zugriff auf private Mitgliedsvariable von Seite
}
};
int main()
{
Seite dieSeite;
freundlich::Seite_Rev_Setzen(dieSeite, 123);
return 0;
}
Das letzte Beispiel zeigt die einseitige Freundschaftsbeziehung, der Klasse freundlich. Auch wenn Klasse freundlich eine andere Klasse als Freund betrachtet, heisst das nicht, dass diese Klasse eine gegenseitige Freundschaft eingeht.