最初にそうでないことは、あなたが派生しているということです std::basic_stringbuf<char>
何らかの理由で、関連するすべての仮想関数を無効にしません。たとえば、オーバーライドしません xsputn()
また sync()
: :これらの機能が最終的に行うことになっても、継承します。ストリームバッファーを導き出すことを強くお勧めします std::basic_streambuf<char>
代わりは!
overflow()
メソッドは、ストリームバッファーの文字列よりも小さい1文字のバッファーを発表します。 &buffer.back()
配列の最後へのポインターではなく、文字列の最後の文字へのポインターです。個人的には、私は使用します
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
これまでのところ問題はありません。ただし、より多くのキャラクターのためのスペースを作成した後、あふれる文字、すなわち、に渡された議論を省略したことを省略しました overflow()
バッファーへ:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
まったく正しくないものがいくつかあります:
- 一般的に、オーバーライドを与えることは悪い考えです
virtual
デフォルトのパラメーターを機能します。基本クラスの関数は既にデフォルトを提供しており、新しいデフォルトは関数が明示的に呼ばれる場合にのみピックアップされます。 返された文字列には、バッファが正確に満たされない限り、これまでに書かれたシーケンスよりも実際に大きいため、最後に多くのヌル文字が含まれる場合があります。おそらく実装する必要があります
str()
異なる機能:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- 文字列を一定の値だけで拡大することは、主要なパフォーマンスの問題です。執筆コスト
n
キャラクターはですn * n
. 。大きい場合n
(彼らは本当に大きくなる必要はありません)これは問題を引き起こします。あなたはあなたを育てる方がはるかに良いですbuffer
指数関数的に、たとえば、毎回それを2倍にするか、1.5
倍増していると感じる場合は、良い考えではありません。