Class ... { friends Funktionsname

Hallo zusammen.

Ich habe bereits nachgelesen aber ich blick die letzte Zeile meines Beispielprogrämmchen nicht.
Sieht so aus:

class KomplexeZahl{ ....
 KomplexeZahl Add\_two\_Komplx\_Zahlen(KomplexeZahl& Klasse){
 ... 
 }
 friend KomplexeZahl Multipliziere\_two\_Komplx\_Zahlen(
 KomplexeZahl& Klasse\_1,KomplexeZahl& Klasse\_2){
 ... 
 }
}
int main(){...
 double Zahl\_1 = 5.5; 
 double Zahl\_2 = 8.7;
 KomplexeZahl Klasse\_1(Zahl\_1,Zahl\_2);

 double Zahl\_1 = 2.5; 
 double Zahl\_2 = 2.7;
 KomplexeZahl Klasse\_2(Zahl\_1,Zahl\_2);

 cout 
Klar, ich frag mich warum man einfach in der main direkt ohne Angabe einer Klasse (und geht so gar ohne Initialisierung)
"Add\_two\_Komplx\_Zahlen(Klasse\_1,Klasse\_2)" aufrufen kann.
Klar das hat mit "friend KomplexeZahl Multipliziere..." usw. zu tun.
Aber warum ?

Schönen Dank
Gruß Sebasitan

Noch was, was ich auch nicht herrausfinden konnte
… hatte ich vorher vergessen zu sagen.

In der mein wird mit einem Überladenen + -Operator gearbeitet.
Mich verwirrt aber die Syntax.

Es funtioniert dort mit:
friend KomplexeZahl operator+( …

wobei ich eigenlich dachte es müsste
friend KomplexeZahl::operator+( …

heisten so habe ich in
http://www.willemer.de/informatik/cpp/cppovrld.htm
nachgelesen.

Komisch.
Diese :: Schreibweise taucht in meinem Beispiel sowieso nie auf.
Echt komisch.

LGrüßles Sebastian

Hallo Sebastian,

hier gehen ein paar Sachen durcheinander. Erstmal: „friend“ ist dazu da, einer Methode oder ganzen Klasse den Zugriff auf „private“ Member-Attribute einer anderen Klasse zu erlauben. Beispiel:

// Vorwärts-Deklaration
class A;

// Globale Funktion
int getX(A & klasseA)
{
return klasseA.x;
}

class A {
// Globale Funktion A darf auf x zugreifen
friend int getX(A & klasseA);

private:
int x;
};

Ohne das „friend“ in Klasse A könnte die Member-Funktion „getX“ in Klasse B nicht auf das Attribute „x“ zugreifen, das wäre eine Access Violation.

Du hast in der ersten Mail eine Methode definiert (also mit Body) und diese als „friend“ angegeben. Damit hast du keine Klassenmethode generiert (die kann nämlich ohnehin auf den kompletten Satz von privaten Attributen zugreifen), sondern eine globale Funktion. Friend wird normalerweise nur mit der Deklaration eine Funktion benutzt.

In der mein wird mit einem Überladenen + -Operator gearbeitet.
Mich verwirrt aber die Syntax.

Es funtioniert dort mit:
friend KomplexeZahl operator+( …

wobei ich eigenlich dachte es müsste
friend KomplexeZahl::operator+( …

Das sind zwei völlig verschiedene Sachen. Das erste ist richtig, da wird angegeben, daß es eine Funktion im globalen Namespace gibt, die „operator+“ heißt, und die ein Objekt der Klasse „KomplexeZahl“ zurückgibt. Im zweiten Fall gibt es eine Methode „operator+“, die friend der Klasse ist, in deren Kontext du dich gerade befindest.