Article View: de.comp.lang.c++
Article #1837Re: Probleme beim Vererben von fstream
From: Bernhard Ruch
Date: Fri, 15 Mar 1996 12:36
Date: Fri, 15 Mar 1996 12:36
88 lines
4463 bytes
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!usenetReferences:
<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)