Forward Deklaration von friend Methoden
-
Hallo allerseits,
ich dachte eigentlich, so langsam habe ich mir das Deklarations/Definintionsmodell verinnerlicht, aber bei folgener Sache komm ich einfach nicht klar:
Ein Beispiel:
Ich habe eine Klasse "Kapsel" mit einem private-Element (int i).
Mit einer zweiten Klasse "Freund" möchte ich in einer einzigen Methode auf das Kapsel::i-Element zugreifen.Allerdings ohne ein KAPSEL::GetI() zu implementieren.
Also muss ich in der Deklaration von "Kapsel" eine friend-Methode aus der Klasse "Freund" benennen,die auf Kapsel::I zugreift.Nun sollen die Klassen-Deklarationen aber in einer Datei stehen und die "Freund"-Deklaration muss NACH/UNTER der "Kapsel"-Deklaration stehen.
Bei normalen Funktionen, die ausserhalb einer Klasse stehen geht das ohne Probleme, da z.B.friend void GetValue(KAPSEL*);
dem Compiler als Deklaration genügt und er weiss, dass die Definition dieser Funktion irgendwann später erfolgt.
Eine Methode
friend FREUND::GetValue(KAPSEL*);
akzeptiert er jedoch nicht, da ihm die Klasse FREUND noch nicht bekannt ist.
Denn die Deklaration von class FREUND kommt ja erst nach der Deklaration von
class Kapsel.Hier das ganze Problem nochmal als Quelltext:
#include "stdio.h" class FREUND; class KAPSEL { int i; friend void ZeigKapselWert(KAPSEL*);//Funktion wird forward deklariert friend void FREUND::ZeigKapselWert(KAPSEL*);//FEHLER: "FREUND" ist undefinierter Typ public: KAPSEL(int Wert); }; class FREUND { public: void ZeigKapselWert(KAPSEL*); }; int main() { KAPSEL myKapsel(5); FREUND myFreund; ZeigKapselWert(&myKapsel);//Funktionsaufruf klappt myFreund.ZeigKapselWert(&myKapsel); return 0; } //Funktionsdefinition void ZeigKapselWert(KAPSEL* p_Kapsel) { printf("Der i-Wert von der Kapsel betraegt:%d\n",p_Kapsel->i); } //Klassendefinitionen KAPSEL::KAPSEL(int Wert) { i = Wert; } void FREUND::ZeigKapselWert(KAPSEL* p_Kapsel) { //Fehler: kein zugriff auf Private Element der Klasse Kapsel printf("Der i-Wert von der Kapsel betraegt:%d\n",p_Kapsel->i); }
In einem Satz:
Bei der Funktion "ZeigKapselWert" klappt es, beir der Methode
"FREUND::ZeigKapselWert" nicht.Wie deklariere ich diese Methode vor der Klasse "Kapsel" OHNE die ganze Klassendeklaration von "Freund" verschieben zu müssen.
Ich hoffe, dass ist für einen Sonntagnachmittag keine allzu lange Problembeschreibung
-
SeppSchrot schrieb:
Bei der Funktion "ZeigKapselWert" klappt es, beir der Methode "FREUND::ZeigKapselWert" nicht.
Wie deklariere ich diese Methode vor der Klasse "Kapsel" OHNE die ganze Klassendeklaration von "Freund" verschieben zu müssen.
Überhaupt nicht. Das sagt die Norm eben so. Frag besser nicht warum, sonst muss ich länger suchen (remember: Es ist Sonntag Abend).