friend class



  • jo Hi.

    Ich wollte schonmal immer friend class nutzen.
    und zwar richtig und sinnvoll.
    1.)
    was heisst bitte in diesem zusammenhang richtig und sinnvoll?

    Ich hab ne art scrabble geschrieben und dachte mir das so:

    Da gibts ne klass , die heisst 'spielstein', und verwaltet eben dese elemnte
    (Buchstabe, wert, AnzahlImSpiel,...), so kann ich mit einer klasse jeden
    Buchstaben darstellen. Außerdem wird in dieser Klasse der Status der Steine
    verwaltet. (im Saeckle, auf der Spielerhand, auf dem brett, an welcher
    Position,...)

    Zur verwaltung aller Spielstein (bei scrabble gibts 102(deutsche version))
    gibts ne 'Vorrat' Klasse spendiert.
    Diese verwaltet alle 102 Steine (Steine * Vorrat[102];) und einen Counter.

    In 'Spielstein' hab ich ne menge readOnly-Properties gesetzt.
    und als 'private' deklariert. Es sollen nämlich alle Aktionen mit den
    Steinen über 'Vorrat' realisiert werden.(Vorrat[Id]->tuDas(),
    Vorrat[Id]->Free=true; )
    Also habe ich vorrat einfach als 'friend class' von 'Spielstein' definiert.
    Somit hat Vorrat Zugriff auf alle 'private' Elemente von 'Spielstein'
    (z.B. als gelegt markieren,...)

    Somit können alle Klassen zwar mit 'Vorrat' kommunizieren(die relevanten
    Methoden sind als 'public' deklariert), nicht aber mit 'Spielstein' direkt.

    Das macht doch eine Menge Sinn.
    die frage ist nur, ob das auch der Sinn hinter 'friend' ist.
    also bitte, meine FRAGE:
    ist das ein manierlicher, objektorientierter Einsatz von 'friend', oder
    ...eben nicht?

    Was wäre dann eine Sinnvolle Anwendung von 'friend'

    would be just good to know...
    and Thx



  • Also habe ich vorrat einfach als 'friend class' von 'Spielstein' definiert.
    Somit hat Vorrat Zugriff auf alle 'private' Elemente von 'Spielstein'
    (z.B. als gelegt markieren,...)

    waere da ne set-methode nicht angebracht?

    enum Location { hand, board, ... };
    
    class foo {
    
    private:
      Location location;
      // ...
    
    public:
      // ...
      void setLocation ( const Location loc )  {
        location = loc;
      };
      // ...
    };
    
      // ...
      foo f;
      f.setLocation ( board );
    

    Was wäre dann eine Sinnvolle Anwendung von 'friend'

    da faellt mir keine ein... 🙄

    was auch immer



  • hab ich doch!!

    class SpielsteinAbgespeckt{
    friend class Vorrat;
    private:
    AnsiString asOrt;
      AnsiString __fastcall getOrt()const{return asOrt;}
      void __fastcall setOrt(Ansistring NV){asOrt=NV;}
    __property AnsiString Ort={read=getOrt,write=setOrt};//read-write für Vorrat
    AnsiString asChar;
      AnsiString __fastcall getChar()const{return asChar;}
      void __fastcall setChar(AnsiString NV){asChar=NV;}
    __property AnsiString Char={read=getChar};//read-only für Vorrat
    
    public:
    SpielsteinAbgespeckt();
    ~SpielsteinAbgespeckt();
    };
    

    (code für BCB3.0)

    aber es soll ja nur 'Vorrat' Zugriff haben.
    weil
    man zieht NICHT einen Spielstein,
    sonder
    man zieht eine Spielstein AUS DEM VORRAT
    !!

    also gute friend nutzung, oder schlechte friend nutzung?



  • Irgendwie klingelt es nach: "Ich weiß nicht was es ist, aber ich möchte es trotzdem haben" 😃 🙂 Nein, im Ernst: wenn keine vernünftige Implementierung von getter und setter realisiert werden kann, dann ist es sinnvoll anderen Klassen einen direkten Zugriff auf Klassen-Elemente zu gewähren, ansonsten kann die öffentliche Schnittstelle benutzt werden.



  • da gibt es einige Gotw Artikel, die was mit dem Thema zu tun haben
    http://www.gotw.ca/gotw/070.htm
    http://www.gotw.ca/gotw/004.htm



  • Wenn du willst,dass nur die Vorrat-Klasse Zugriff auf die Spielstein-Klasse hat,warum machst du dann den ctor und dtor nicht auch noch privat?


Anmelden zum Antworten