代码之家  ›  专栏  ›  技术社区  ›  Daniel McLaury

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

c++
  •  -1
  • Daniel McLaury  · 技术社区  · 6 年前

    在C++中, std::basic_iostream 的复制和移动分配运算符受到保护(原因我不太明白)。这似乎让我没有很多方法来管理 iostream 对象,而不是在堆中手动分配它们、存储指针列表和编写清理它们的析构函数。

    我是不是错过了一些可以让我把它们分配到 std::vector ?

    当然,我想我可以继承并将受保护的运营商提升到公众面前,但这看起来像是一团乱麻。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   eerorika    6 年前

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

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

    std::stringbuf sb;
    std::array streams{
        std::iostream(&sb),
        std::iostream(&sb),
    };
    
        2
  •  0
  •   bruno    6 年前
    #include <fstream>
    #include <vector>
    
    int main()
    {
      std::vector<std::fstream> * v = new std::vector<std::fstream> (2);
    
      (*v)[0].open("/tmp/0", std::ios_base::out);
      (*v)[1].open("/tmp/1", std::ios_base::out);
    
      (*v)[0] << "000" << std::endl;
      (*v)[1] << "111" << std::endl;
    
      delete v;
    }
    

    编译和执行:

    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