Funktionsweise von IO-Streams
-
> Ich sehe immer nur einen Puffer. Wo ist da was doppelt?
Na die Basisklasse hat ja auch einen. Irgendwo muss sie irgendeinen basic_streambuf<>*-Member haben, der von rdbuf() zurückgegeben wird. Ich würde ja gerne genau diesen internen Puffer benutzen (der mit dem Member identisch ist), aber das geht ja eben (wegen Slicing-Problem) nicht.
-
Ad aCTa schrieb:
> Ich sehe immer nur einen Puffer. Wo ist da was doppelt?
Na die Basisklasse hat ja auch einen. Irgendwo muss sie irgendeinen basic_streambuf<>*-Member haben, der von rdbuf() zurückgegeben wird. Ich würde ja gerne genau diesen internen Puffer benutzen (der mit dem Member identisch ist), aber das geht ja eben (wegen Slicing-Problem) nicht.
Welche Basisklasse meinst Du? std::basic_streambuf<> hat keinen Buffer nicht ein Byte.
Der Stream (z.B.: std::ostream) hat einen Pointer (nicht Komposition) auf einen std::basic_streambuf<>, das ist ein Objekt und kein Puffer im Sinne eines Memory-Buffers. Diesen Pointer auf das Buffer-Objekt kann man mit rdbuf() abholen. (Bem.: rdbuf() erbt jeder Stream von std::basic_ios<>)
Ein Stream selbst puffert nie ein Zeichen, er arbeitet eher wie ein Durchlauferhitzer.Ein Slicing-Problem mit Stream oder Buffer kann es hier gar nicht geben, da weder die Streams noch die Buffer kopierbar bzw. zuweisbar sind (zumindest vom Sinn her). Sollten sie es rein formal sein, ist das eher als Fehler zu sehen.
Gruß
Werner
-
Mit Puffer meine ich ja den Streambuf. Dass man sich den mit rdbuf() abholt etc. ist mir ja bewusst, ich kenne Sinn und Bedeutung von Stream (Formatierung/Kommunikation) und Puffer (Speicher/Physikalische Verbindung).
Wenn mein streambuf eine neue Methode dazubekommt (meinetwegen open()), dann kann ich diese Methode nur über einen Zeiger dieser selben Klasse aufrufen. Wenn ich aber nun rdbuf() in meinem Stream benutze, um Methoden wie connect/init/etc im Streamkonstruktor aufzurufen, werde ich scheitern, da rdbuf() einen Zeiger auf die Basisklasse zurückgibt, bei dem es diese Methoden nicht gibt, obwohl der Zeiger selbst auf ein Objekt zeigt, welche sie hat (dank statischer Bindung). Das meine ich mit slicing.