なぜ `std :: basic_ios`にパブリックコンストラクタがあるのですか?


15

std::basic_iosパブリックコンストラクタがあります:

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

IMO、クラスがパブリックコンストラクターを持つ唯一の理由は、プログラムでそのクラスのスタンドアロンインスタンスを使用することです。クラスが存在し、他のクラスがそのクラスの子孫である場合のみ(の場合のようにbasic_ios)、クラスのすべてのコンストラクターはでなければなりませんprotected。のコンストラクタstd::ios_baseはすべて保護されています。しかし、何らかの理由で、標準の設計者はこれをbasic_iospublicの1つのコンストラクターにしました。

basic_iosは、いくつかのストリームタイプの基本クラスとして使用されます。少なくとも、basic_istreamまたはでなかった使用例を想定することはできませんbasic_ostream。ありますか?

回答:


1

クラスがパブリックコンストラクターを持つもう1つの理由は、このコンストラクターシグネチャを派生オブジェクトの構築に使用できるようにするためです。

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

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

    public:
    A(void*);
    };

 A a(10);

基本コンストラクターのusing宣言は継承されたコンストラクターのアクセシビリティを変更しないため、コンストラクターは基本クラスでパブリックである必要があります。


2
afaikを除いbasic_iosて、basic_streambuf*あなたがすることができる前から、俳優が公にされているのは理にかなっているようですusing B::B;。古い実装にはプロキシーctorがあっただけだと思います:-ctorが正しいA(int x) : B(x) {}場合でも問題なく機能します。Bprotected
Ted Lyngmo

0

私は通知に失敗すると、そのでしたstd::basic_istreamstd::basic_ostreamstd::basic_iostream(それぞれがとりもpublicコンストラクタを持っていましたstd::basic_streambuf*)。

これは、多型の一般的なプログラミング類似物を、pimplのイディオムと同じように使用できるようにします。

つまり、この方法で、特殊なstreambufタイプを作成し、それをbasic_[io] で使用できますstream。特殊なストリームクラスを作成する必要はありません。(機能は制限されています。同じストリームに新しいバッファーを割り当てることはできません。また、バッファーの有効期間と所有権を外部から追跡する必要があります)。

専用のbasic_[io] fstreambasic_[io]にはstringstreamそれぞれ、関連するバッファタイプの完全なインスタンスが含まれています。つまり、特殊なストリームタイプのインスタンスは、その内部バッファでのみ機能し、別のタイプではなく、同じタイプのインスタンスでも機能します。生のbasic_[io] を使用することstreamは、これに対する(不格好な)回避策です。

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.