🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Probleme beim Vererben von fstream

#1837
From: Bernhard Ruch
Date: Fri, 15 Mar 1996 12:36
88 lines
4463 bytes
Dietmar Kuehl wrote:
> 
> Hi,
> 
> ich habe mich ja schonmal gehoerig auf den A**** gesetzt, als ich einen
> radikal anderen Ansatz bei einem Problem mit 'ostream's vorgeschlagen
> habe... Also kann ich das ruhig nochmal machen :-)
> 
> Bernhard Ruch (Bernhard.Ruch@studi.epfl.ch) wrote:
> : Ich moechte eine neue Klasse ObjectStream definieren, die von der
> : Klasse fstream vererbt wird. Zusaetzlich zu den gewoehnlichen
> : fstream-Operationen soll das Lesen und Schreiben von Objekten
> : moeglich sein.
> 
> Hm. Wenn ich ganz ehrlich bin, vermute ich eher (aufgrund des Rests
> Deines Artikels), dass Du in Wirklichkeit Problem und Loesung mixt: Du
> moechtest Objekte lesen und schreiben. Wie das geloest wird ist erstmal
> noch offen. Allerdings ist unwahrscheinlich, dass Du es vernuenftig
> loesen kannst, indem Du von irgendeinen Stream ableitest: Die
> verschiedenen Klassen, die von 'ostream' bzw. 'istream' abgeleitet sind
> (z.B. 'ofstream' und 'ifstream'; 'fstream' gibt es in der Standard C++
> Library garnicht) sind eigentlich nur Hilfsklassen, die ein 'ios' (die
> gemeinsame Basisklasse von 'ostream' und 'istream') mit einem Objekt
> einer von 'streambuf' abgeleiteten Klasse initialisieren! Die
> verschiedene 'streambuf's unterscheiden sich darin WIE die Sachen
> geschrieben werden und nicht WAS geschrieben wird. Genauso verhaelt es
> auch mit klassen wie '[io]fstream':  Es wird ein File zum
> schreiben/lesen benutzt. Bei '[io]stringstream' wird ein 'string'
> benutzt usw.

Ich muss vielleicht die Ausgangslage genauer beschreiben:

Ich benoetige eine Klasse ObjectStream, welche die folgenden Operatoren enthaelt:
(Da dies Spezifikationen meines Projektes sind, kann ich sie nicht aendern)

	ObjectStream &operator << (char);
	ObjectStream &operator << (int);
	ObjectStream &operator << (float);
	etc.

	ObjectStream &operator >> (char &);
	ObjectStream &operator >> (int &);
	ObjectStream &operator >> (float &);
	etc.

	ObjectStream &operator << (const Object &);
	ObjectStream &operator >> (Object &);
	ObjectStream &operator << (const Object *);
	ObjectStream &operator >> (Object **);
	u.a.

Dies antwortet auf die Frage, WAS geschrieben und gelesen werden soll.

Da es schon verschiedene Stream-Klassen gibt, welche die Operatoren <<
und >> fuer die vordefinierten Typen (char, int, etc) enthalten, schien
es mir das einfachste zu sein, diese Operatoren wiederzuverwenden, indem
meine Klasse ObjectStream von einer dieser Stream-Klassen vererbt wird,
und dann die neuen Operatoren hinzuzufuegen.	

Nun zur Frage, WIE geschrieben und gelesen werden soll: Da diese Operatoren
auf ein File angewendet werden sollen, draengte es sich auf, die Klasse 
ObjectStream von fstream (anstatt iostream) zu vererben, da sie somit alle
File-spezifischen Eigenschaften von fstream wiederverwenden kann.

> ...

> : Wenn ich nun versuche, diesen Code zu compilieren, meldet der Compiler,
> : dass er keinen Operator << fuer (ObjectStream, int) kenne, obwohl ja
> : ObjectStream von fstream abgeleitet ist und diesen Operator kennen
> : muesste:
> 
> :   g++ -c Test.cc
> :   Test.cc: In method `void Object::SaveData(class ObjectStream &)':
> :   Test.cc:20: no match for `operator <<(class ObjectStream, int)'
> 
> Der Compiler hat recht! Er sieht nur den 'operator << (ObjectStream,
> Object &)', alle anderen Funktionen mit dem gleichen Namen (in diesem
> Fall 'operator <<') sind versteckt.  Wenn Du sie wirklich benutzen
> wolltest (was Du aber in diesem Fall gar nicht wirklich willst, siehe
> oben), dann koenntest Du es forcieren, z.B. mit 'ostream::operator<<
> (17)'.

Gibt es eine andere Art, die vordefinierten Operatoren <<, >> und die
File-spezifischen Eigenschaften von fstream wiederzuverwenden und 
neue Stream-Operatoren hinzuzufuegen, als von einer Stream-Klasse
zu vererben?

Bernhard
Technical Details
Message-ID: <3149644C.41C6@studi.epfl.ch>
Path: arc1-ca.pugleaf.net!dinews.epfl.ch!usenet
References: <31486437.41C6@studi.epfl.ch> <4ia5sb$cfk@news.BelWue.DE>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!dinews.epfl.ch!usenet
From: Bernhard Ruch <Bernhard.Ruch@studi.epfl.ch>
Newsgroups: de.comp.lang.c++
Subject: Re: Probleme beim Vererben von fstream
Date: Fri, 15 Mar 1996 13:36:28 +0100
Organization: Ecole Polytechnique Federale de Lausanne
Message-ID: <3149644C.41C6@studi.epfl.ch>
References: <31486437.41C6@studi.epfl.ch> <4ia5sb$cfk@news.BelWue.DE>
NNTP-Posting-Host: didec6.epfl.ch
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailer: Mozilla 2.0 (X11; I; OSF1 V3.2 alpha)