Das erste, was nicht, ist, dass Sie abgeleitet werden std::basic_stringbuf<char>
Aus irgendeinem Grund, ohne alle relevanten virtuellen Funktionen zu überschreiben. Zum Beispiel überschreiben Sie nicht xsputn()
oder sync()
: Was auch immer diese Funktionen tun, werden Sie erben. Ich würde dringend empfehlen, Ihren Stream -Puffer abzuleiten std::basic_streambuf<char>
stattdessen!
Das overflow()
Methode kündigt einen Puffer an, der ein Zeichen ist, der kleiner als die Zeichenfolge zum Stream -Puffer ist: &buffer.back()
Ist kein Zeiger auf das Ende des Arrays, sondern zum letzten Zeichen in der Zeichenfolge. Persönlich würde ich verwenden
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
Bisher gibt es kein Problem. Nachdem Sie jedoch Platz für weitere Zeichen geschafft haben, die Sie weggelassen haben, haben Sie den überfüllten Charakter hinzugefügt, dh das Argument, an das übergeben wurde overflow()
zum Puffer:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Es gibt noch ein paar kleine Dinge, die nicht ganz richtig sind:
- Es ist im Allgemeinen eine schlechte Idee, übergeordnet zu werden
virtual
Funktioniert einen Standardparameter. Die Basisklassenfunktion liefert bereits die Standardeinstellung und der neue Standard wird nur aufgegriffen, wenn die Funktion jemals explizit bezeichnet wird. Die zurückgegebene Zeichenfolge kann am Ende eine Reihe von Nullzeichen enthalten, da die gehaltene Zeichenfolge tatsächlich größer ist als die Sequenz, die bisher geschrieben wurde, es sei denn, der Puffer ist genau voll. Sie sollten wahrscheinlich die implementieren
str()
anders funktionieren:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- Das Wachstum der Zeichenfolge um einen konstanten Wert ist ein wichtiges Leistungsproblem: die Kosten des Schreibens
n
Charaktere istn * n
. Für größeren
(Sie müssen nicht wirklich riesig werden) Dies wird zu Problemen führen. Sie sind viel besser dran, Ihre zu wachsenbuffer
exponentiell, zB, verdoppelt es jedes Mal oder wachsen um einen Faktor von1.5
Wenn Sie das Gefühl haben, ist es keine gute Idee.