Trotz "friend class" kein Zugriff auf private Attribute/Methoden



  • Hallo!

    Folgendes Beispiel:

    class Myclass {
        public:
    
            Myclass();
    
        private:
            void m1();
            bool m2();
            float m3(float a, float b):
    
            friend class TestMyClass;
        };
    

    Testklasse:

    class TestMyclass {
          public:
               bool testM3() {
                    Myclass my;
                    float result = my.m3(5.87, 3.48);
    
                    // if result == xxx -> bla
               }
    };
    

    Der Compiler sagt mir, dass trotz "friend class" die Methode in diesem Kontext private ist. Benutze ich das Schlüsselwort falsch?



  • Schau dir mal GENAU an, wie die friend class heißt, und wie die zugreifende.
    TIP: C++ ist case-sensitive.



  • Der Hinweis ist schon gut, aber das war/ist nicht die Ursache. Hab meinen Code ein wenig vereinfacht für das Forum und dabei hat sich der Fehler eingeschlichen 🙄

    Ich hab den Klassennamen sogar kopiert, damit mir kein Tippfehler unterläuft.

    Kann es evtl. daran liegen, dass die "Freundklasse" ausschließlich in einer cpp-Datei deklariert ist und nicht in einer Headerdatei?



  • Freund schrieb:

    Hab meinen Code ein wenig vereinfacht für das Forum

    Hast du geprüft, ob der vereinfachte Code das Problem reproduziert? Ansonsten hast du den fehlerhaften Teil beim Vereinfachen entfernt.



  • MFK schrieb:

    Freund schrieb:

    Hab meinen Code ein wenig vereinfacht für das Forum

    Hast du geprüft, ob der vereinfachte Code das Problem reproduziert? Ansonsten hast du den fehlerhaften Teil beim Vereinfachen entfernt.

    Ja, ich hatte den "fehlerhaften" Teil entfernt. Es lag daran, dass MyClass sich in einem Namespace befindet:

    namespace ns {
    class Myclass {
        public:
    
            Myclass();
    
        private:
            void m1();
            bool m2();
            float m3(float a, float b):
    
            friend class TestMyClass;
        };
    }
    

    Klasse TestMyClass war aber in keinem Namespace und somit galt da friend nur für ns::TestMyClass.

    Frage: Wie gebe ich in MyClass syntaktisch an, dass eine TestMyClass außerhalb der Namespaces gemeint ist, in der sich MyClass befindet?



  • friend class ::TestMyClass;
    

    TestMyClass muss aber (durch Vorwärtsdeklaration) bekannt sein.


Anmelden zum Antworten