使用RAII与C ++流和STL容器?

时间:2010-07-29 15:28:05

标签: c++ stl raii iostream

我正在尝试将RAII个概念用于STL容器的ofstream对象。例如:

int main(int argc, char**argv)
{
  std::deque<std::ofstream> sList;

  sList.push_back(std::ofstream()); // tried variations such as *(new ofstream())
  sList[0].open("test1.txt");
  sList[0] << "This is a test";
  sList[0].close();
}

然而,无论我如何尝试调整代码和声明,编译器总是抱怨。显然,生活在流内部的std :: basic_ios的拷贝构造函数是私有的。使用RAII是否有任何简单的plian C ++ / STL解决方案,或者我是否需要使用某种类型的智能指针?

6 个答案:

答案 0 :(得分:5)

标准库容器存储值的副本,而不是值本身。因此,必须使用可以复制的对象(在这种情况下为智能指针)。

另一种选择是boost::ptr_vector,它可以作为精确针对这种情况的指针向量。

答案 1 :(得分:4)

无法复制流对象,因此您无法创建它们的容器 - 您必须使用某种指针。

deque <ofstream *> files;
files.push_back( new ofstream );
// and later delete it, or use a smart pointer

答案 2 :(得分:3)

为了防止文件被写入系统各个部分的多个位置,流是不可复制的。一个智能指针可能是这里的方式。

答案 3 :(得分:3)

您可能需要获得某种涉及的智能指针。容器的一个要求(至少在C ++中)是将容器放入容器中,它必须是可复制的 - 并且流不能可复制。

FWIW,在C ++ 0x中,这可能是直接的 - 它允许容器保存可移动但不可复制的项目,并且流将是可移动的(但仍然不可复制)。

答案 4 :(得分:2)

ofstream已经开始使用RAII。ofstream的析构函数会自动关闭文件,因此您无需这样做。

使用

std::vector<boost::shared_ptr<std::ofstream>> 

作为您的容器,删除矢量时将删除所有文件句柄。

不要使用std :: auto_ptr!

的容器

答案 5 :(得分:0)

尝试使用boost :: ref。这意味着存储引用而不复制它们。 http://www.boost.org/doc/libs/1_43_0/doc/html/ref.htm