为什么`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用作几种流类型的基类,并且我不能设想用例中至少有一个不是a basic_istream或的用例basic_ostream。有一个吗?

Answers:


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:A(int x) : B(x) {}-即使Bctor是,也可以正常工作protected
Ted Lyngmo

0

我没有注意到的是std::basic_istreamstd::basic_ostream并且std::basic_iostream还有公共构造函数(每个都有一个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";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.