Suche eine ausführliche Doku zur ostream Klasse



  • SirLant schrieb:

    Was haltet ihr davon`? Bin für konstruktive Kritik offen 🙂

    ich kann zB nicht
    myObject.serialize(dein_stream);
    machen, weil dein_stream kein ostream ist.
    ich kann nicht
    getline(dein_stream, str);
    machen...

    Wie sieht es mit der Synchornisation eingabe/ausgabe aus?

    Warum puffert der Stream und nicht der Streambuffer (der bei dir IMostreamDevice) heisst - denn schliesslich weiss ja nur er, wohin ausgegeben wird und kann somit optimal puffern...

    Warum verwendest du keine exception? Wenn du schon die kompatibilitaet zu ostream aufgibst, dann mach das design wenigstens besser 🙂

    Woran hapert es denn bei Josuttis' Variante?



  • An Exceptions hab ich auch schon gedacht, soll ich dann Exceptions schmeißen statt
    Funktionen wie goodbit und badbit usw. anzubieten wie es iostream tut?

    Naja mir ist nicht klar, wie Josuttis' Variante z.B. auf nem von mir geschriebenen
    Ausgabestrom Daten ausgeben kann.

    Die Klasse von mir kann _nur_ Daten ausgeben, keine einlesen.
    Ich dachte eigentlich, dass ich den Benutzer entscheiden lassen kann ob ein
    Puffer verwendet wird und in welcher Größe und das wird dann an die Implementierung
    von IMostreamDevice weitergereicht.

    Ein getline gibt es daher nicht, und putline ist im Grunde unnötig, da man ja
    die Daten mit einem einfachen myObj << "Tolle Zeile"; ausgeben kann.



  • SirLant schrieb:

    An Exceptions hab ich auch schon gedacht, soll ich dann Exceptions schmeißen statt
    Funktionen wie goodbit und badbit usw. anzubieten wie es iostream tut?

    Exakt. streams bieten d ja die schoene methode setexceptions() an 🙂

    Naja mir ist nicht klar, wie Josuttis' Variante z.B. auf nem von mir geschriebenen
    Ausgabestrom Daten ausgeben kann.

    Jousstis verlang, dass man die Datei selber oeffnet - mit der Funktion open() und am ende wieder schliesst (mit close())

    Das ist uU wichtig um den Code zu verstehen.

    Im prinzip macht der Stream ansich dann ja nicht viel. Naemlich ausser dem Ctor garnix.

    Die ganze Arbeit uebernehmen die streambuffer.

    da gibt es overflow() und xsputn(), die die schreibarbeit uebernehmen.
    und das war es dann ja auch schon.

    Ich dachte eigentlich, dass ich den Benutzer entscheiden lassen kann ob ein
    Puffer verwendet wird und in welcher Größe und das wird dann an die Implementierung
    von IMostreamDevice weitergereicht.

    OK, das ist akzeptabel. Ich dachte der stream ansich puffert dann.

    die Daten mit einem einfachen myObj << "Tolle Zeile"; ausgeben kann.

    mein myObj.writeAt(stream); funktioniert trotzdem immer noch nicht.



  • für ein myObj.writeAt (stream) müsste ich ja nur eine Funktion anbieten, welche
    ein istream Objekt übernehmen kann, oder?



  • SirLant schrieb:

    für ein myObj.writeAt (stream) müsste ich ja nur eine Funktion anbieten, welche
    ein istream Objekt übernehmen kann, oder?

    Ich meinte damit im Prinzip - dass garkeine bestehende Funktion mit deinem stream umgehen kann:

    stream<<string("hallo");
    geht zB auch nicht.

    denn alle streams sind entweder istream oder ostream (oder manchmal auch beide). dein stream ist etwas anderes - ich kann deshalb meine ueberladenen operatoren (<<) nicht verwenden, sondern muesste sie nochmal ueberladen.

    und genau das macht deine klasse leider relativ sinnlos. es ist zwar logisch gesehen ein stream, aber fuer den compiler eben nicht (keine IS-A beziehung)



  • Das wird sie nicht können, du könntest aber einfach mostream cout (outputObj);
    schreiben, dann die Daten ausgeben und später diese Zeile löschen, und das normale
    cout benutzen.
    Das war eigentlich mein Ziel.

    Ich werde nacher wenn ich Zeit habe die Exceptions einbauen und noch ein zwei
    Änderungen vornehmen und dir nochmal zeigen, besonders bei den Exceptions werd
    ich deinen (euren :)) Rat brauchen, habe bisher noch nie damit gearbeitet.



  • SirLant schrieb:

    Das wird sie nicht können, du könntest aber einfach mostream cout (outputObj);

    mostream cout (outputObj)
    string s("hello world");
    cout<<s;
    

    😞



  • Hm... was unterstützt denn alles die streams, könnte für diese ja eine Funktion
    hinzufügen.



  • SirLant schrieb:

    Hm... was unterstützt denn alles die streams, könnte für diese ja eine Funktion
    hinzufügen.

    du hast meine postings nicht verstanden oder?
    _jede_ Klasse kann einen op<< haben und _keiner_ wird bei dir funktionieren.

    sicher für string lässt sich einer schreiben, aber gehen wir weiter: es gibt unendlich viele Klassen und das stream Konzept ist eben dafür da, dass sich jedes Objekt auf jeden stream ausgeben kann - indem eben ostream als interface (wenn man so will) verwendet wird. deine klasse macht das nicht, deswegen kann man sie nicht mit bestehenden klassen verwenden.

    der aufwand es nochmal richtig zu machen wäre sicher geringer als für alle möglichen typen einen op<< zu implementieren (abgesehen von der zeit die du für die ganzen features brauchst, die ostream dir ja frei haus liefert).



  • Hm dann wir das ganze um einiges schwieriger für mich, muss mich dann wohl nochmal
    reinknien und schauen ob ich es hinbekomme 🙂

    Danke 🙂


Anmelden zum Antworten