`Std :: বেসিক_আইএস` এর কেন একজন পাবলিক কনস্ট্রাক্টর রয়েছে?


15

std::basic_iosজনসাধারণের নির্মাতা রয়েছে :

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

আইএমও, কোনও ক্লাসের পাবলিক কনস্ট্রাক্টর থাকার একমাত্র কারণ হ'ল কোনও প্রোগ্রামে class শ্রেণীর একক উদাহরণ ব্যবহার করা। যদি কোনও শ্রেণি উপস্থিত থাকে তবে কেবলমাত্র অন্য শ্রেণিগুলি এর থেকে নেমে আসে (যেমনটি মনে হয় 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
আফাইক ব্যতীত অনুরোধযোগ্য মনে হচ্ছে, গ্রহণকারী basic_iosকর্টরটি আপনি করার basic_streambuf*আগে থেকেই প্রকাশ্যে এসেছিল using B::B;। আমি প্রত্যাশা করি যে পুরানো বাস্তবায়নগুলিতে সবেমাত্র একটি প্রক্সি কর্টর ছিল: A(int x) : B(x) {}- Bএটির সিটার হলেও এটি কাজ করে 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এটির (চতুর) কাজ work

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";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.