mittels friend nur bestimmte Members freigeben



  • Hallo,

    gibt es eine Möglichkeit mittels friend nicht eine ganze Klasse sondern nur bestimmte Members zugreifbar zu machen?

    Hintergrund ist, dass ich mit Graphen arbeite und eine Klasse Node habe

    class Node
    {
        Node* next;
        Node* prev;
        void set_next(Node* n);
        void set_prev(Node* n);
        ...
    public:
        ...
    }
    

    Die Knoten sind im Graphen irgendwie geordnet, daher prev und next.

    Nun will ich einer Klasse K erlauben,

    void set_next(Node* n);
        void set_prev(Node* n);
    

    zu benutzen. Wenn ich aber einfach

    friend class K;
    

    in Node einfüge, darf K ja auf alles zugreifen (was es nicht soll).

    Was macht man da am besten?



  • dann mach set_next und set_prev doch public



  • zwutz schrieb:

    dann mach set_next und set_prev doch public

    Was dazu führt das jeder die Methoden aufrufen kann, und das ist vom OP sicher nicht gewünscht. Da ich friend extrem selten verwende: ich glaube friend geht immer nur auf Ebene der Klasse, da man meist aber die friend class und class in der Hand hat ist dies aber eher unproblematisch.



  • Es können sowohl Klassen als auch Funktionen als friend deklariert werden.
    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_friend.html

    Gruss Simon



  • Wenn ich das richtig sehe, wird auf

    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_friend.html (siehe Beitrag simon.gysi)

    der Fall beschrieben, dass man eine komplette Klasse für eine einzelne Funktion zugreifbar machen will.

    Ich will es aber andersherum: eine einzelne Member-Funktion (und nichts vom Rest der Klasse) für eine andere Klasse zugreifbar machen.



  • class Node
    {
       private:
         Node* next;
         Node* prev;
         void set_next();
         void set_prev();
       public:
         friend void guterFreund() {set_next();}
         .
         .
         .
    };
    

    oder habe ich jetzt an deiner Frage vorbeigeschrieben...?
    Falls ja sorry 😃



  • warum möchtest du das? immerhin gehört eine friend funktion zum normalen interface deiner klasse. du versteckst ja auch nicht die daten vor anderen memberfunktionen?

    wie auch immer gibt es natürlich möglichkeiten, zu erreichen, dass bestimmte funktionen nur eine partielle sicht auf die daten ermöglicht wird. z.b. könntest du mit pimpl arbeiten; oder helfer-funktionen erstellen, mit denen die "freunde" arbeiten können. oder sonst irgendwie die daten, auf die zugegriffen werden können soll, von dem rest der klasse abkapseln. (basisklassen, helferklassen, ...)

    beispiel (pimpl):

    //node.h
    class Node
    {
       struct NodeData;
       NodeData* data;
       void set_next (Node* n);
    
    public:
       friend void guterFreund ();
    };
    
    //node.cc
    #include "node.h"
    
    struct Node::NodeData
    {
       Node* next, *prev;
    };
    
    void Node::set_next (Node* n)
    {
       data->next = n; //OK
    }
    
    //freunde.cc
    void guterFreund ()
    {
       Node n;
       n.data->next = new Node; //Fehler!
       n.set_next(new Node); //OK.
    }
    


  • @queer boy

    hey cool, du hast meine Namensgebung übernommen 😃 👍


Log in to reply