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).


Anmelden zum Antworten