为什么 std::basic_ios 有一个公共构造函数?
Why does std::basic_ios have a public constructor?
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
。 有吗?
类具有公共构造函数的另一个原因是具有此构造函数签名可用于构造派生对象:
struct B{
B(int);
protected:
~B();
};
struct A:B{
private://no effect.
using B::B;
public:
A(void*);
};
A a(10);
构造函数在基类中必须是公共的,因为基构造函数的 using 声明不会更改继承构造函数的可访问性。
我没有注意到的是,std::basic_istream
、std::basic_ostream
和std::basic_iostream
也有公共构造函数(每个都需要一个std::basic_streambuf*
(。
这允许多态性的泛型编程类似物,与痘痘习语相同。
也就是说,通过这种方式,您可以创建专用的 streambuf 类型并在basic_
[io]stream
中使用它,而无需创建专用的流类。(功能有限:不能将新缓冲区分配给同一流,并且必须在外部跟踪缓冲区的生存期和所有权(。
专用basic_
[io]fstream
和basic_
[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, worldn";
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 关于复制构造函数的一个棘手问题
- C++构造函数,一个用于度,一个用于弧度
- 在成员初始值设定项列表和构造函数主体中委派构造函数有什么区别
- 关于QLIST类型实例复制构造函数的一个奇怪问题
- 删除默认类构造函数有什么意义?
- 如何应用使默认构造函数有条件地显式
- 两种类型的定义构造函数有什么区别?第一个使用":",第二个用大括号(如函数)定义它
- SquareMatrix 的 ADT 构造函数有什么问题?
- 需要使班级(long_number)用构造函数和一个打印功能代表1到60的任何长度
- 运算符 = 不匹配,构造函数创建一个指针
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 为什么我不能在 c++ 类中声明一个空构造函数,该构造函数从一个具有私有构造函数的构造函数扩展而来
- 如何使构造函数接受一个非常量对象
- 初始值设定项列表,可变参数模板和构造函数推导:一个奇怪的情况
- shared_ptr的原始指针构造函数是一个错误吗?
- 通过初始化列表调用另一个类的构造函数.有问题
- 一个非平凡的复制构造函数有什么作用
- 有一个转换构造函数有什么意义?
- 按值传递给函数和按值传递给另一个构造函数时,调用构造函数有什么不同?