next up previous contents index
Next: Vermeide öffenliche Datenelemente Up: 50 Ways to Improve Previous: Minimale Klassenschnittstellen

Element-, Freund- oder globale Funktionen

     

Außer bei virtuellen Funktionen, die immer Elementfunktionen sein müssen, ist die Entscheidung oft nicht leicht.  

Im Zweifelsfall: Benutze OO-Stil tex2html_wrap_inline5173 Elementfunktionen.

Aber:

    class bruch
    { int zaehler;
      int nenner; 
      public:
      bruch (int z = 0, int n = 1);
      int zae() { return zaehler;}
      int nen() { return nenner;}
      bruch operator* (const bruch& b);
    };
    ...
    bruch viertel(1,4);
    bruch achtel(1,8);
    bruch result = viertel * achtel; // OK
    result = result * 5; // OK
    result = 2 * achtel; // FEHLER !

Der linke (implizite) Operand muß vom Typ bruch sein.

Also: Nicht-Element-Funktion:

    bruch operator* ( const bruch& b1,
                       const bruch& b2)
    { return bruch(b1.zae() * b2.zae(),
                   b1.nen() * b2.nen());
    }

So funktioniert auch result = 2 * achtel.

Sollte operator* Freund der Klasse sein?

In unserem Fall: nein, da Zugriffsfunktionen (inline) auf die nicht-öffentlichen Datenelemente existieren.

Aber häufig ist es nötig:

    class string
    { ...
      ostream& operator<<(ostream& o);
    };
    ...
    string s;
    s << cout;

Das ist legal, entspricht aber nicht den Konventionen!

tex2html_wrap_inline5173 Globale Freund-Funktion.


next up previous contents index
Next: Vermeide öffenliche Datenelemente Up: 50 Ways to Improve Previous: Minimale Klassenschnittstellen

Peter Pfahler, 1997