Frage zur Friend-Funktion



  • Hey Leute,

    habe in meinem Programm ein Problem, folgendes:

    classA.h

    #include "classB.h"
    class A:
    {
        friend void B funktion();
    };
    

    classB.h

    class B:
    {
        void funktion();
    };
    

    Die funktion ist in classB.cpp implementiert.

    So ich bekomme die Fehler meldung in classA.h dass B has not been declared.

    Hoffe ihr könnnt mir helfen;-)

    Danke schonmal



  • Meinst du nicht eher

    friend void B::funktion();



  • Jap, dass hatte ich vorher auch schon probiert, leider erfolglos=(

    Und nun?



  • Achso, ganz vergessen:
    funktion ist privat, deswegen kann A nicht drauf zugreifen.
    Das klappt:

    class B
    {
    public:
        void funktion();
    }; 
    
    class A
    {
    	friend void B::funktion();
    };
    


  • Sorry, habe die Funktion natürlich public, wollte nur son ähnliches Beispiel machen, wies bei mir der Fall ist, kann auch mal kurz meine ganze Klasse posten, bzw direkt mein Beispiel blos minimiert:
    classInventar.h

    #ifndef CLASSINVENTAR_H_INCLUDED
    #define CLASSINVENTAR_H_INCLUDED
    
    #include "classItems.h"
    #include "classHeld.h"
    #include <vector>
    #include <boost/smart_ptr/shared_ptr.hpp>
    #include <fstream>
    
    typedef boost::shared_ptr<Item> bPtr;
    
    class Inventar
    {
        public:
            void itemHinzufuegen( bPtr theItem );
            void itemLoeschen();
            void showAll();
            bool itemCheckWaffe( int&, int&, std::string& );
            bool itemCheckRuestung( int&, int&, std::string& );
            bool itemCheckZauberWaffe( int&, int&, std::string& );
            friend void Held::writeInventar( std::ofstream );
    
        private:
            std::vector< bPtr > items;
            std::vector< bPtr >::iterator theIt;
    };
    
    #endif // CLASSINVENTAR_H_INCLUDED
    

    classHeld.h

    #ifndef CLASSHELD_H_INCLUDED
    #define CLASSHELD_H_INCLUDED
    
    #include <string>
    #include "classInventar.h"
    #include "classItems.h"
    #include <boost/smart_ptr/shared_ptr.hpp>
    #include <fstream>
    
    typedef boost::shared_ptr<Item> bPtr;
    
    class Held
    {
        public:
            Held( std::string name );
            Held( std::string name, int schnelligkeit, int staerke, int zauberfaehigkeit, int gesundheit, int ruestung, int level, int spielfortschritt, int exp, int typ );
            ~Held();
    //blablabla.....
     void writeInventar( std::ofstream );
    
        private:
            std::string itsName;
    //blablabla....
    };
    
    #endif // CLASSHELD_H_INCLUDED
    


  • Mh, wenn ich jetzt ein Minimalbeispiel ähnlich deinem erstelle, bekomme bei friend void Held::writeInventar( std::ofstream ); den Fehler, dass Held keine Klasse oder Namespace ist.
    Es funktioniert, wenn du die komplette Klasse Held als friend einträgst.

    Vielleicht weiß einer der anwesenden C++-Gurus genaueres.



  • Aschenputtel schrieb:

    Mh, wenn ich jetzt ein Minimalbeispiel ähnlich deinem erstelle, bekomme bei friend void Held::writeInventar( std::ofstream ); den Fehler, dass Held keine Klasse oder Namespace ist.
    Es funktioniert, wenn du die komplette Klasse Held als friend einträgst.

    Weil damit die Klasse Held zugleich deklariert wird.
    mit

    class Held;
    

    vor der eigegen Klasse müßte die Klasse auch deklariert werden können und des friend unten erlauben.



  • Mhh ok und was genau heißt das jetzt?
    Was muss ich machen..;-)


Anmelden zum Antworten