`Std :: basic_ios` का सार्वजनिक निर्माण क्यों होता है?


15

std::basic_iosएक सार्वजनिक निर्माता है :

explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);

IMO, किसी क्लास के पास पब्लिक कंस्ट्रक्टर होने का एकमात्र कारण प्रोग्राम में उस क्लास के स्टैंडअलोन इंस्टेंस का उपयोग करना है। यदि एक वर्ग केवल अन्य वर्गों के पास होता है, तो उससे उतरता है (जैसा कि मामला लगता है basic_ios), सभी वर्ग के निर्माता होने चाहिए protected। के कंस्ट्रक्टर std::ios_baseसभी संरक्षित हैं। लेकिन, किसी कारण से, मानक के डिजाइनरों ने इसे basic_iosसार्वजनिक रूप से एक निर्माता बना दिया ।

basic_iosकई स्ट्रीम प्रकारों के लिए एक बेस क्लास के रूप में उपयोग किया जाता है, और मैं एक उपयोग के मामले की कल्पना नहीं कर सकता, जहां आपके पास कम से कम basic_istreamया एक नहीं था basic_ostream। वहाँ एक है?

जवाबों:


1

सार्वजनिक निर्माणकर्ता के पास एक वर्ग होने का दूसरा कारण यह है कि इस निर्माणकर्ता के पास एक व्युत्पन्न वस्तु बनाने के लिए हस्ताक्षर उपलब्ध हैं:

struct B{
  B(int);
  protected:
  ~B();
  };

 struct A:B{
    private://no effect.
    using B::B;

    public:
    A(void*);
    };

 A a(10);

कंस्ट्रक्टर को बेस क्लास में सार्वजनिक होना चाहिए क्योंकि बेस कंस्ट्रक्टर की घोषणा से वंशानुगत कंस्ट्रक्टर की पहुंच में बदलाव नहीं होता है।


2
दूर लगता है, afaik को छोड़कर, basic_iosctor लेने basic_streambuf*से पहले आप कर सकते हैं सार्वजनिक किया गया है using B::B;। मुझे उम्मीद है कि पुराने कार्यान्वयन में सिर्फ एक प्रॉक्सी ctor था: A(int x) : B(x) {}- जो ठीक है भले ही Bctor हो protected
टेड लिंग्गो

0

मैं जो नोटिस करने में विफल रहा std::basic_istream, वह था , std::basic_ostreamऔरstd::basic_iostream भी था सार्वजनिक निर्माणकर्ता (प्रत्येक लेता है std::basic_streambuf*)।

यह पिंपल मुहावरे के रूप में एक ही नस में बहुरूपता के एक सामान्य-प्रोग्रामिंग एनालॉग के लिए अनुमति देता है।

यही है, इस तरह से आप एक विशेष स्ट्रीमब्यूफ प्रकार बना सकते हैं और इसका उपयोग एक basic_[io] में कर सकते हैंstream बिना विशेष स्ट्रीम कक्षाएं बनाए। (कार्यक्षमता सीमित है: आप एक ही स्ट्रीम में एक नया बफर असाइन नहीं कर सकते हैं, और आपको बाहरी रूप से बफर के जीवनकाल और स्वामित्व पर नज़र रखना होगा)।

विशेष basic_[io] fstreamऔर basic_[io] stringstreamप्रत्येक में संबंधित बफर प्रकार का पूरा उदाहरण है। इसका मतलब है कि एक विशेष स्ट्रीम प्रकार का एक उदाहरण केवल इसके आंतरिक बफर के साथ काम करेगा और दूसरा नहीं, उसी प्रकार का एक भी नहीं। एक कच्चे basic_[io] streamका उपयोग करना इसके लिए एक (clunky) समाधान है।

template<class C, class TR>
class snazzy_filebuf: public std::basic_streambuf<C, TR>
{
 protected:
   typename TR::int_type overflow(TR::int_type) override;
   typename TR::int_type underflow(TR::int_type) override;
   typename TR::int_type pbackfail(TR::int_type) override;
 public:
   snazzy_filebuf();
};

.....
snazzy_filebuf<char> buf;
std::basic_ostream<char> o_s(&buf); 

o_s << "Hello, world\n";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.