design frage



  • hola leute

    ich bin grad am stricken einer streamklasse fuer binaere daten.

    der derzeitige source hat ca. 370 zeilen, weshalb ich ihn hier nicht reinstelle.
    http://www.komports.de/StreamSource.zip
    hier ist er zum runterladen.
    mich wuerde interessieren, wie ich das designmaessig am besten mache und ob mein derzeitiger weg halbwegs richtig ist.
    was koennte man anders und besser machen.

    Meep Meep



  • Für den dynamischen Puffer könntest du std::vector nehmen und hierbei:

    base_stream::~base_stream(void)
       {
          if(buffer)
          {
             free(buffer);
          }
       }
    

    kannst du die if-Abrage weglassen. NULL-Pointer werden von free ignoriert.



  • lol, implementier das lieber wie die iostreams

    was du da machst ist einfach nur schrecklich:

    ...
             /* Operatoren */
             bin_stream& operator<<(const int8 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(int8 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const uint8 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(uint8 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const int16 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(int16 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const uint16 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(uint16 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const int32 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(int32 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const uint32 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(uint32 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const int64 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(int64 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const uint64 &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(uint64 &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const bool &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(bool &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const long &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(long &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const unsigned long &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(unsigned long &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const float &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(float &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const double &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(double &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    
             bin_stream& operator<<(const long double &value)
             {
                WriteToBuffer(value);
                return *this;
             }
    
             bin_stream& operator>>(long double &value)
             {
                ReadFromBuffer(value);
                return *this;
             }
    ...
    


  • re

    @*kotz*
    freut mich das du schon als programmierguru auf die welt gekommen bist. ich muss es leider lernen.

    die operator<< und operator>> zeilen gefallen mir genauso wenig. hab da schon mal im forum nachgefragt, ob man das nicht umgehen kann. kam leider keine positive rueckmeldung.

    wie ist das in der iostream implementiert ?
    mir fehlt einfach ein ansatz mit dem ich beginnen kann.

    @bug
    danke fuer den hinweis.

    Meep Meep

    PS: ich wuerd mich freuen, wenn mir jemand sagen muss, das er wegen meiner strickerei kotzen muss, er das dann auch mit einem registriertem nick macht



  • HumeSikkins postet regelmässig Seiten wo die IOStreams erklärt werden und wie man selbst ein Stream implementiert.



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-112246-and-highlight-is-stream.html

    ^Lies dir den ersten link gut durch, wenn du ihn verstanden hast,
    kannst du dir gedanken über das Design machen...

    btw. die op >> Zeilen lassen sich wohl kaum vermeiden, es sei den,
    man macht ne template funktion draus 😉

    Devil



  • Meep Meep schrieb:

    ich bin grad am stricken einer streamklasse fuer binaere daten.

    ich bin am stricken einer stream-klasse für ascii-ausgabe. das binäre habe ich verschoben, da ich es als "prinzipiell einfach" einschätzte.

    übrigens kannste für die ganzen PODs vermutlich ein template nehmen.

    template<class T>
    bin_stream& operator<<(const T &value)
    {
    WriteToBuffer(value);
    return *this;
    }

    ich will direkt auch WinAPI bzw. linux-kernel-calls aufsetzen. und mir geht es nur um performance. keine locales, keine states, jedes if ist böse. falls du sowas verrücktes magst, schick mir eine mail an volkard@normannia.de, vielleicht können wir uns ergänzen. ich würde dich die ganze arbeit machen lassen und du hättest den gewinn, daß ich viele knieschüsse, die erst in 6 monaten weh tun, am ersten tag sehe.



  • re

    @devil81

    das mit dem template ist mir schon klar. gibt halt das problem, das man ohne fehlermeldung

    std::vector<std::string> x;
    bin_stream stream;
    stream << x;
    

    schreiben koennte. was aber natuerlich nicht das gewuenschte ergebnis bringen wuerde.
    aus diesem grund hab ich das gemeinsame in ein template gesetzt und dann nur die typen bestimmt.

    ich guck mir dann mal die links an.

    Meep Meep


Anmelden zum Antworten