Frage

Für pädagogische Zwecke ich einen ostream und Strompuffer erstellen möchten zu tun:

  1. fix endians wenn tun << myVar;
  2. Laden in einem Deque Container anstelle von std: cout oder das Schreiben in eine Datei
  3. zusätzliche Daten einzuloggen, wie, wie oft ich habe <<, wie oft ich habe .WRITE ich die Menge der geschriebenen Bytes und wie oft ich flush (). Aber brauche ich nicht alle Informationen.

Ich habe versucht, eine Überlastung aber nicht schrecklich. Ich habe versucht, Schreib Überlastung, indem Sie

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

in meiner basic_stringstream2 Klasse (kopierte ich Paste basic_stringstream in meine CPP-Datei und modifiziert es), aber der Code gehalten basic_ostream verwenden. Ich schaute durch Code und es sieht aus wie ich xsputn Überlastung müssen (die auf dieser Seite erwähnen nicht http : //www.cplusplus.com/reference/iostream/ostream ), aber was sonst muss ich überlasten? und wie konstruiere ich meine Klasse (was es zu erben braucht, usw.)?

War es hilfreich?

Lösung

Der kanonische Ansatz besteht Ihre eigene streambuf zu definieren. Sie sollten einen Blick auf:

Andere Tipps

A + C) Ich glaube, Sie an Facetten aussehen sollten, sie ändern, wie Objekte als Zeichen geschrieben. Sie könnten Statistiken speichern auch hier auf, wie oft Sie Ihre Objekte gestreamt. Schauen Sie sich Wie kann ich meine eigenen Objekte zu formatieren, wenn STL Streams? für ein Beispiel.

Für B) Sie müssen Ihre eigenen streambuf erstellen und Ihre Ostream zu diesem Puffer (Konstruktorargument verbinden). Siehe Lucs Links + Ableitung neue streambuf Klassen . Kurz gesagt müssen Sie dies für eine ostream (Minimum) implementieren:

  • Überlauf (put ein einzelnes Zeichen oder Flush-Puffer) ( Link )
  • xsputn (char legte eine Array-Puffer) ( Link )
  • sync ( Link )

Ich bin nicht sicher, dass Sie wollen, was möglich zu tun ist. Die << Operatoren sind nicht virtuell. So könnte man yourstream &operator << (yourstream &strm, int i) definieren zu tun, was Sie mit der Endian-Umwandlung und das Zählen wollen, und es wird funktionieren, wenn Ihr Code direkt aufruft. Aber wenn Sie ein Objekt in yourstream eine Funktion übergeben, die eine Ostream erwartet, zu jeder Zeit, die Anrufe << funktioniert, wird es anstelle von Ihnen auf die ursprüngliche Ostream Version gehen.

Wie ich es verstehe, haben die Ströme Einrichtungen so eingerichtet, dass man „leicht“ einen neuen Stream-Typ definieren, die eine andere Art von Puffer verwendet (wie, sagen wir, ein deque von Zeichen), und Sie können sehr leicht die Unterstützung für Ihre eigenen Klassen über << ausgibt. Ich glaube nicht, Sie in der Lage sein sollen, die mittlere Schicht zwischen denen, neu zu definieren.

Und vor allem ist der gesamte Punkt der << Schnittstelle schön formatierte Textausgabe zu liefern, während es klingt wie Sie tatsächlich Binärausgang wollen. (Andernfalls wird der Verweis auf „Endian“ macht keinen Sinn.) Selbst wenn es gibt einen Weg, dies zu tun, weiß ich nicht, wird es bestenfalls umständlich Binärausgang erzeugen. Betrachten wir zum Beispiel ein Punkt im 3D-Raum des Endbenutzers Überlastung ausgegeben. Die Endbenutzer-Version von << wird wahrscheinlich so etwas wie << '(' << x << ", " << y << ", " << z << ')' tun. Das wird in einem Text-Stream schön aussehen, aber es ist eine Menge vergeudeter und völlig nutzlos Zeichen in einem binären Stream, die im Idealfall nur << x << y << z verwenden würde. (Und wie viele Anrufe << sollten diese zählen als?)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top