2009-02-07 16 views
17

Für pädagogische Zwecke möchte ich einen ostream und Strompuffer zu schaffen, zu tun:Wie erstelle ich mein eigenes Ostream/Streambuf?

  1. fix endians wenn < < meineVar tun;
  2. Speicher in einem Deque Container statt std verwenden: cout oder Schreiben in eine Datei
  3. log zusätzliche Daten, wie zum Beispiel, wie oft habe ich < <, wie oft ich .WRITE habe ich die Menge der geschriebenen Bytes und wie oft ich flush(). Aber ich brauche nicht alle Informationen.

Ich versuchte überladen, aber scheiterte schrecklich. Ich habe versucht, Schreib Überlastung durch

ostream& write(const char* s, streamsize n) 

in meiner basic_stringstream2 Klasse zu tun (ich Paste basic_stringstream in meine CPP-Datei kopiert und modifiziert es), aber der Code gehalten basic_ostream verwenden. Ich schaute Code durch und es sieht so aus, als müsste ich xsputn überlasten (was auf dieser Seite nicht erwähnt wird), aber was muss ich noch überladen? und wie konstruiere ich meine Klasse (was muss sie erben usw.)?

+1

Könnten Sie bitte einen Auszug des Codes zur Verfügung stellen, dass "mit basic_ostream gehalten"? –

Antwort

1

Ich bin mir nicht sicher, dass das, was Sie tun möchten, möglich ist. Die Operatoren << sind nicht virtuell. So könnten Sie yourstream &operator << (yourstream &strm, int i) definieren, um mit der Endian-Umwandlung und -Zählung zu tun, was Sie wollen, und es wird funktionieren, wenn Ihr Code es direkt aufruft. Wenn Sie jedoch ein yourstream-Objekt an eine Funktion übergeben, die einen Ostream erwartet, wird diese Funktion bei jedem Aufruf der Funktion << an die ursprüngliche ostream-Version statt an Ihre ursprüngliche ostream-Version gesendet.

Wie ich es verstehe, die Streams Einrichtungen wurden eingerichtet, so dass Sie "leicht" einen neuen Stream-Typ definieren können, die eine andere Art von Puffer verwendet (wie sagen wir, eine Charge), und Sie können sehr Fügen Sie einfach die Unterstützung für die Ausgabe Ihrer eigenen Klassen über << hinzu. Ich denke nicht, dass Sie beabsichtigen, die Mittelschicht zwischen diesen neu zu definieren.

Und vor allem der gesamte Punkt der << Schnittstelle ist schön formatierte Textausgabe zu liefern, während es klingt, als ob Sie tatsächlich binäre Ausgabe wollen. (Sonst macht der Verweis auf "Endian" keinen Sinn.) Selbst wenn man davon ausgeht, dass dies möglich ist, weiß ich es nicht, es wird bestenfalls eine peinliche binäre Ausgabe erzeugen. Betrachten Sie zum Beispiel die Endbenutzerüberlastung, um einen Punkt im 3D-Raum auszugeben. Die Endbenutzerversion von << wird wahrscheinlich so etwas wie << '(' << x << ", " << y << ", " << z << ')' tun. Das sieht in einem Textstream gut aus, aber es sind eine Menge vergeudeter und völlig nutzloser Zeichen in einem binären Stream, der idealerweise einfach << x << y << z verwenden würde. (Und wie viele Aufrufe an << sollten diese als zählen?)

6

For A + C) Ich glaube, Sie sehen sollten Facetten ändern sie, wie Objekte als Zeichen geschrieben werden. Sie können hier auch Statistiken speichern, wie oft Sie Ihre Objekte gestreamt haben. Check out How to format my own objects when using STL streams? für ein Beispiel.

Für B) Sie müssen Ihren eigenen streambuf erstellen und Ihren ostream mit diesem Puffer verbinden (Konstruktorargument). Siehe Luc's links + Deriving new streambuf classes. Kurz gesagt müssen Sie dies für eine ostream (Minimum) implementieren:

  • Überlauf (put ein einzelnes Zeichen oder Flush-Puffer) (link)
  • xsputn (ein char-Array setzen zu puffern) (link)
  • Sync (link)
+0

Die meisten Links in diesem sind jetzt baumeln. – Omnifarious

Verwandte Themen