我正在尝试将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解决方案,或者我是否需要使用某种类型的智能指针?
答案 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