سؤال

للأغراض التعليمية، أرغب في إنشاء مخزن مؤقت للتيار والبث للقيام بما يلي:

  1. إصلاح endians عند القيام << myVar؛
  2. قم بالتخزين في حاوية deque بدلاً من استخدام std:cout أو الكتابة إلى ملف
  3. تسجيل بيانات إضافية، مثل عدد المرات التي قمت فيها <<، وعدد المرات التي قمت فيها بالكتابة، وكمية البايتات التي كتبتها، وعدد المرات التي قمت فيها بالمسح ().لكنني لست بحاجة إلى كل المعلومات.

حاولت التحميل الزائد ولكن فشلت فشلا ذريعا.حاولت التحميل الزائد على الكتابة عن طريق العمل

ostream& write( const char* s, streamsize n ) 

في صف basic_stringstream2 الخاص بي (لقد قمت بنسخ لصق basic_stringstream في ملف cpp الخاص بي وقمت بتعديله) لكن الكود استمر في استخدام basic_ostream.لقد بحثت في الكود ويبدو أنني بحاجة إلى التحميل الزائد على xsputn (وهو ما لم يتم ذكره في هذه الصفحة http://www.cplusplus.com/reference/iostream/ostream ) ولكن ماذا أحتاج إلى التحميل الزائد؟وكيف أقوم ببناء صفي (ما الذي يجب أن يرثه، وما إلى ذلك)؟

هل كانت مفيدة؟

المحلول

يتمثل النهج الأساسي في تحديد Streambuf الخاص بك.ينبغي عليك إلقاء نظرة على:

نصائح أخرى

بالنسبة لـ A+C) أعتقد أنه يجب عليك النظر إلى الجوانب، فهي تعدل كيفية كتابة الكائنات كأحرف.يمكنك تخزين الإحصائيات هنا أيضًا حول عدد المرات التي قمت فيها ببث الأشياء الخاصة بك.الدفع كيفية تنسيق الكائنات الخاصة بي عند استخدام تدفقات STL؟ على سبيل المثال.

بالنسبة إلى B) تحتاج إلى إنشاء Streambuf الخاص بك وتوصيل ostream الخاص بك بهذا المخزن المؤقت (وسيطة المنشئ).يرى روابط لوك + اشتقاق فئات Streambuf جديدة.باختصار تحتاج إلى تنفيذ ذلك لـ ostream (الحد الأدنى):

  • تجاوز السعة (ضع حرفًا واحدًا أو مخزنًا مؤقتًا) (وصلة)
  • xsputn (ضع مصفوفة char في المخزن المؤقت)(وصلة)
  • مزامنة (وصلة)

لست متأكدًا من أن ما تريد القيام به ممكن.ال << المشغلين ليسوا افتراضيين.لذلك يمكنك تحديد yourstream &operator << (yourstream &strm, int i) لتفعل ما تريد من خلال التحويل والعد endian، وسيعمل عندما يستدعيه الكود الخاص بك مباشرةً.ولكن إذا قمت بتمرير كائن yourstream إلى وظيفة تتوقع ostream، في أي وقت تستدعي هذه الوظيفة <<, ، فسوف ينتقل إلى إصدار ostream الأصلي بدلاً من إصدارك.

كما أفهمها، تم إعداد مرافق التدفقات بحيث يمكنك "بسهولة" تحديد نوع دفق جديد يستخدم نوعًا مختلفًا من المخزن المؤقت (مثل، على سبيل المثال، مجموعة من الأحرف)، ويمكنك بسهولة إضافة دعم لـ إخراج الفصول الدراسية الخاصة بك عبر <<.لا أعتقد أنك تهدف إلى أن تكون قادرًا على إعادة تعريف الطبقة الوسطى بين هؤلاء.

وعلى وجه الخصوص، بيت القصيد من << تتمثل الواجهة في توفير إخراج نص منسق بشكل جيد، بينما يبدو أنك تريد بالفعل إخراجًا ثنائيًا.(وإلا فإن الإشارة إلى "endian" لا معنى لها.) حتى بافتراض وجود طريقة ما للقيام بذلك، لا أعرف، فإنها ستنتج مخرجات ثنائية غير ملائمة في أحسن الأحوال.على سبيل المثال، ضع في اعتبارك التحميل الزائد للمستخدم النهائي لإخراج نقطة في مساحة ثلاثية الأبعاد.نسخة المستخدم النهائي من << ربما سوف تفعل شيئا من هذا القبيل << '(' << x << ", " << y << ", " << z << ')'.سيبدو ذلك جميلًا في دفق النص، ولكنه يحتوي على الكثير من الأحرف الضائعة وغير المفيدة تمامًا في دفق ثنائي، والذي من الأفضل أن يستخدم فقط << x << y << z.(وكم عدد المكالمات إلى << هل ينبغي اعتبارها؟)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top