Klassen mit friend Funktionen auf mehrere Dateien. Wie?



  • Hallo allerseits,

    ich beschäftige mich seit kurzem mit C++ und habe folgendes Problemchen. Ich möchte, daß die Memberfunktion der Klasse A auf ein private Element der Klasse B zugreifen kann. Das funktioniert auch so lange, bis ich die Klassen in eigene Headerdateien schreibe. Kann mir vielleicht jemand einen verständlichen Tip geben? Meine Bücher und die MSDN haben mir nicht wirklich weitergeholfen. Auch hier im Forum habe ich nichts brauchbares entdeckt. Ich benutze VisualC++ .NET SP1 bzw. KDevelop 3.1.0 Das Problem habe ich in beiden IDE´s. Wäre echt für Hilfe dankbar.

    class B;
    
    class A
    {
    public:
    	int getZahl(B&);
    };
    
    class B
    {
    public:
    	friend int A::getZahl(B&);
    private:
    	int zahl;
    };
    
    int A::getZahl(B& b)
    {
    	return b.zahl;
    }
    

    Funktioniert 👍
    -----------------------------------------------------------------

    #ifndef _A_H_
    #define _A_H_
    
    #include "b.h"
    
    class A
    {
    public:
    	int getZahl(B&);
    };
    
    #endif
    
    #ifndef _B_H_
    #define _B_H_
    
    #include "a.h"
    
    class B
    {
    public:
    	friend int A::getZahl(B&);
    private:
    	int zahl;
    };
    
    #endif
    
    #include "a.h"
    #include "b.h"
    
    int A::getZahl(B& b)
    {
    	return b.zahl;
    }
    

    Funktioniert nicht 👎
    -----------------------------------------------------------------

    Bekomme folgenden Kompilerfehler:
    error C2653: 'A' : Keine Klasse oder Namespace
    a.cpp(6): error C2248: "B::zahl" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "B" erfolgte
    b.h(11) : Siehe Deklaration von 'B::zahl'
    b.h(7) : Siehe Deklaration von 'B'

    Grüße Cody



  • Hallo

    int A::getZahl(B& b)
    {
        return b.zahl;
    }
    

    du greifst ja auch von einer Methode von A auf ein internes Member von B zurück.
    Im zweiten Fall brauchst du doch gar keine friend-Methode, verlagere den Getter einfach in B.

    akari



  • Hi akari,

    das verstehe ich jetzt nicht so ganz. Das ist doch der Sinn der Sache, daß ich mit einer Methode aus A auf ein private Element von B zugreifen kann.

    Die get Funktion möchte ich aus design-technischen Gründen nicht in B haben. Die Klasse A holt sich bei B Werte, die für die Berechnung ihrer eigene Werte dienen.
    In Bsp1 klappt es ja. Nur wenn ich auf mehrere Dateien auslagere, gehts nicht. Warum?
    Klasse A und B sind ja nur vereinfachte Bsp. damit ich das raffe. 😃



  • mal hier geschaut?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-104820.html

    ist zwar nicht ganz das thema, aber ich würde sagen mit geter und seter ist es besser gelöst...



  • Hilft mir nicht so richtig weiter. Bin noch zu frisch dafür. 😞
    Ich habe aber eine Lösung gefunden. 🙂

    Datei: a.h

    #ifndef _A_H_
    #define _A_H_
    
    #include "b.h"
    
    class A
    {
    public:
    	int getZahl(B&);
    };
    
    #endif
    

    Datei: b.h

    #ifndef _B_H_
    #define _B_H_
    
    #include "a.h"
    
    class B
    {
    public:
    	friend int A::getZahl(B& b){return b.zahl;}
    private:
    	int zahl;
    };
    
    #endif
    

    Habe die Funktion nun inline gemacht und es funktioniert. Kann mir jemand erklären warum das so ist?

    Über friend schreiben die Bücher irgendwie nicht viel.

    Grüße
    Cody


Anmelden zum Antworten