Article View: de.comp.lang.c++
Article #1887Re: Probleme beim Vererben von fstream
From: Thomas Holubar
Date: Sun, 24 Mar 1996 04:00
Date: Sun, 24 Mar 1996 04:00
81 lines
3290 bytes
3290 bytes
hf@colibri.de (Harald Fuchs) wrote:
>Thomas Holubar <holubar@informatik.uni-frankfurt.de> writes:
>
>> [deleted]
>
>> Zunaechst: ein ueberladener stream-Operator _muss_ eine
>> "friend-function" sein.
>
>Nein. Eine externe Funktion, die auf private Member zugreift, muΓ
>eine Friend-Funktion sein. Das ist fΓΌr einen Stream-Operator aber
>nicht unbedingt der Fall:
>
Ok, mit meinem "muss friend-function sein" habe ich mich nicht
richtig ausgedrueckt. Allerdings wuerde ich doch _sehr_ empfehlen
stream-Operatoren als "friend" zu deklarieren.
Der Unterschied zwischen
class Unkonventionell
{
..
ostream & operator<< (ostream &);
..
};
und
class Normal
{
..
friend ostream & operator<< (ostream &, Normal &);
..
};
liegt darin, dass erstere zu einer wahrscheinlich nicht gewollten
Verhaltensweise fuehrt (was natuerlich m/reine Spekulation ist):
Man betrachte folgende Anweisung:
cout << A << B << C;
// entspricht: ((cout << A) << B) << C;
Dies wuerde "normalerweise" zu folgender Evaluation fuehren:
1. (cout << A) // schreibt A nach cout, liefert cout
2. (cout << B) // " B " " "
3. cout << C // " C " " "
Mit einer als friend deklarierten Funktion klappt das auch ganz wunderbar,
nicht aber mit der unkonventionellen Variante.
Diese sieht naemlich eigentlich so aus:
ostream & operator<< (Unkonventionell *, ostream &);
^
|
versteckter "this"-Zeiger
Abgesehen davon, dass "this" ein Zeiger und keine Referenz ist sind die
Parameter hier auch in einer "unkonventionellen" Reihenfolge (was natuerlich
Definitionssache ist).
Um die gleiche Ausgabe wie in obigem Beispiel zu erhalten muesste ich jetzt
also wie folgt codieren:
C << (B << (A << cout));
Obwohl das sicherlich wunderbar funktioniert (hab's allerdings noch nicht
selbst probiert) bleibe ich doch lieber bei der "konventionellen" Methode ;-)
>
>> "Win95: from the people who brought you 'edlin' !" (seen on USENET)
>
>Ist "edlin" wirklich so furchtbar, wie alle behaupten? :-)
Wenn alle es behaupten kann es doch gar nicht falsch sein - oder? ;-)
(Ausserdem ist das "Niedermachen" von M$-Software doch Mega-In und wer
will sich denn schon selbst outen indem er/sie da nicht mitmacht :-))
--
Thomas Holubar / finger holubar@rz.uni-frankfurt.de for PGP key
/ eMail: holubar@stud.uni-frankfurt.de
/ WWW : http://www.uni-frankfurt.de/~holubar
"Win95: from the people who brought you 'edlin' !" (seen on USENET)
Technical Details
Message-ID:
<4j2hdo$lrk@zeus.rbi.informatik.uni-frankfurt.de>Path:
arc1-ca.pugleaf.net!zeus.rbi.informatik.uni-frankfurt.de!usenetReferences:
<31486437.41C6@studi.epfl.ch> <4isqrl$s7h@zeus.rbi.informatik.uni-frankfurt.de> <pud965qak1.fsf@themroc.colibri.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!zeus.rbi.informatik.uni-frankfurt.de!usenet From: Thomas Holubar <holubar@informatik.uni-frankfurt.de> Newsgroups: de.comp.lang.c++ Subject: Re: Probleme beim Vererben von fstream Date: 24 Mar 1996 04:00:56 GMT Organization: J. W. Goethe-Universitaet Frankfurt/Main Message-ID: <4j2hdo$lrk@zeus.rbi.informatik.uni-frankfurt.de> References: <31486437.41C6@studi.epfl.ch> <4isqrl$s7h@zeus.rbi.informatik.uni-frankfurt.de> <pud965qak1.fsf@themroc.colibri.de> NNTP-Posting-Host: dialin140.rz.uni-frankfurt.de Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Mailer: Mozilla 1.1N (X11; I; Linux 1.2.6 i486) X-URL: news:pud965qak1.fsf@themroc.colibri.de