أول ما لا يجب أن تستمد منه std::basic_stringbuf<char>
لأي سبب من الأسباب دون تجاوز جميع الوظائف الافتراضية ذات الصلة. على سبيل المثال ، لا تتغلب xsputn()
أو sync()
: مهما كانت هذه الوظائف في نهاية المطاف ، سترثها. أود أن أوصي بشدة باستخلاص المخزن المؤقت للتيار الخاص بك std::basic_streambuf<char>
في حين أن!
ال overflow()
تعلن الطريقة عن مخزن مؤقت وهو حرف واحد أصغر من السلسلة إلى المخزن المؤقت للتيار: &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
بشكل كبير ، على سبيل المثال ، يضاعفه في كل مرة أو ينمو بعامل من1.5
إذا شعرت أن المضاعفة ليست فكرة جيدة.