我可以存储iostream的集合而无需在堆上手动分配它们吗?

时间:2019-02-21 17:18:41

标签: c++

在C ++中,std::basic_iostream的复制和移动分配运算符受到保护(出于我不太了解的原因)。这似乎使我缺乏许多方法来管理iostream对象的集合,缺少手动在堆上分配它们,存储指针列表以及编写析构函数以清理它们的方法。

我错过了一些技巧,可以让我在std::vector里面分配它们吗?

当然,我想我可以继承并只将受保护的运算符提升为公开,但这似乎是一团糟。

奖励问题:为什么这些方法首先受到移动分配运算符的保护?

3 个答案:

答案 0 :(得分:1)

  

我可以在堆以外的任何地方存储iostream集合吗?

唯一不动态分配的标准容器是std::array。您可以将iostream存储在一个数组中:

std::stringbuf sb;
std::array streams{
    std::iostream(&sb),
    std::iostream(&sb),
};

答案 1 :(得分:0)

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra s.cc
pi@raspberrypi:/tmp $ rm -f 0 1
pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $ ls -l 0 1
-rw-r--r-- 1 pi pi 4 févr. 21 18:39 0
-rw-r--r-- 1 pi pi 4 févr. 21 18:39 1
pi@raspberrypi:/tmp $ cat 0 1
000
111

编译和执行:

labelpad

答案 2 :(得分:0)

为了解决这个问题,我将总结FrançoisAndrieux的评论,这些评论加起来解决了这个问题:

尽管std::iostream不是抽象类,并且可以实例化和使用,但这不是意向;相反,您应该从中继承来构建自己的流。然后,您可以实现move构造函数并将其放入std::vector或任何您想要的文件中。