2

我正在尝试将RAII概念与 ofstream 对象的 STL 容器一起使用。例如:

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 的复制构造函数是私有的。是否有任何简单的 C++/STL 解决方案可以使用 RAII 执行此操作,或者我是否需要涉及某种类型的智能指针?

4

6 回答 6

5

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

另一种选择是boost::ptr_vector针对这种情况充当指针向量。

于 2010-07-29T15:35:39.733 回答
4

流对象不能被复制,所以你不能创建它们的容器——你必须使用某种指针。

deque <ofstream *> files;
files.push_back( new ofstream );
// and later delete it, or use a smart pointer
于 2010-07-29T15:34:40.947 回答
3

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

于 2010-07-29T15:35:39.640 回答
3

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

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

于 2010-07-29T15:36:37.203 回答
2

ofstream 具有 RAII。ofstream 的析构函数会自动关闭文件,因此您不需要这样做。

利用

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

因为您的容器和所有文件句柄将在您删除矢量时被删除。

不要使用 std::auto_ptr 的容器!

于 2010-07-29T15:39:10.483 回答
0

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

于 2010-07-29T15:38:34.630 回答