🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1636

Re: Funktion einer Klasse=Friend einer anderen Klasse?

#1636
From: Dietmar Kuehl
Date: Sun, 25 Feb 1996 15:46
77 lines
3103 bytes
Hi,
Thomas Beck (tombeck@usemail.com) wrote:
: Kann eine Funktion einer Klasse als Friend einer anderen Klasse definiert
: werden?

Sicher. Allerdings muss die entsprechende Klasse samt Member-Funktion
deklariert sein bevor man sie zu einem 'friend' deklarieren kann:
jemanden, den Du noch nicht kennst, wuerdest Du vermutlich auch nicht
als 'Freund' bezeichnen, oder?

: Bei meinem Versuch (rudimentaeres Beispiel folgt) erhalte ich folgende
: Fehlermeldung waehrend des Kompilierens:

:         friend xyz::g();
:                        ^
: test.cpp(4) : Error: 'xyz' must be a class name preceding '::'

Das ist doch schon ein Hinweis: 'xyz' soll eine Klasse sein, also kann
man 'xyz' ja mal als Klasse deklarieren. Die naechste Fehlermeldung ist
dann was, was einem mitteilt, dass 'g()' kein Member von 'xyz' ist oder
dass 'xyz' noch nicht definiert ist. Ergo: Man muss 'xyz' VOR 'abc'
definieren.  Schade eigentlich, denn damit kann man kein Objekt der
Klasse 'abc' als Member haben, sondern muss sich mit einen Pointer
helfen. Hier ist ein Beispiel fuer zwei Klassen, bei denen die
Memberfunktion der einen ein 'friend' der anderen ist (Namen und
Formatierung leicht geaendert...):

  class ABC; // forward deklaration: 'ABC*' is now a known type
  class XYZ
  {
  private:
    ABC *a_ptr;

    XYZ(XYZ const &);             // generated verion is useless
    XYZ &operator= (XYZ const &); // generated verion is useless

  public:
    XYZ();
    ~XYZ();
    void g();
  };

  class ABC
  {
    friend XYZ::g();
  private:
    int value;
  };

  XYZ::XYZ(): a_ptr(new ABC) {}
  XYZ::~XYZ() { delete a_ptr; }
  void XYZ::g()
  {
    a_ptr->value=0;
  };

  int main()
  {
    XYZ z;
    z.g();
    return 0;
  }

Ob man wirklich eine derart starke Bindung zwischen zwei Klassen haben
will, ist eine andere Frage (es gibt eine zyklische Abhaengigkeit
zwischen 'XYZ' und 'ABC'; "Taming C++", Jiri Soukup, Addison-Wesley,
ist dazu eine aufschlussreiche Literatur) und da stilistische Fragen in
diesem Forum ja anscheinend gelegentlich persoenlich genommen werden,
gehe ich darauf garnicht erst ein (insbesondere, da mir ja wiedermal
das Umfeld nicht bekannt ist; ganz konnte ich es mir dennoch nicht
verkneifen, da zyklische Abhaengigkeiten fuer mich so aehnlich sind wie
frei rumlaufende Pointer; vielleicht etwas schlimmer). Es geht auf
jeden Fall....
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID: <4gq09e$ifl@news.BelWue.DE>
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
References: <4goe2m$7bb@pacifica.access.ch>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Newsgroups: de.comp.lang.c++
Subject: Re: Funktion einer Klasse=Friend einer anderen Klasse?
Date: 25 Feb 1996 15:46:54 GMT
Organization: Fakultät für Mathematik und Informatik
Distribution: world
Message-ID: <4gq09e$ifl@news.BelWue.DE>
References: <4goe2m$7bb@pacifica.access.ch>
Reply-To: dietmar.kuehl@uni-konstanz.de
NNTP-Posting-Host: uzwil.informatik.uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]