[英]Using RAII with C++ streams and STL containers?
我正在嘗試將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解決方案,或者我是否需要涉及某種類型的智能指針?
標准庫容器存儲值的副本,而不是值本身。 因此,你將不得不使用可復制的對象(在這種情況下,智能指針)。
另一種方法是boost::ptr_vector
,它可以作為指針的向量,精確地boost::ptr_vector
這種情況。
Stream對象無法復制,因此您無法創建它們的容器 - 您必須使用某種指針。
deque <ofstream *> files;
files.push_back( new ofstream );
// and later delete it, or use a smart pointer
為了保持文件不被寫入系統的各個部分中的多個位置,流是不可復制的。 一個智能指針可能是這里的方式。
您可能需要獲得某種涉及的智能指針。 容器的一個要求(至少在C ++中)是將容器放入容器中,它必須是可復制的 - 並且流不可復制。
FWIW,在C ++ 0x中,這可以直接實現 - 它允許容器保存可移動但不可復制的項目,並且流將是可移動的(但仍然不可復制)。
ofstream有RAII烘焙.ofstream的析構函數自動關閉文件,所以你不需要。
采用
std::vector<boost::shared_ptr<std::ofstream>>
作為您的容器,刪除向量時將刪除所有文件句柄。
不要使用std :: auto_ptr的容器!
嘗試使用boost :: ref。 這意味着存儲引用而不復制它們。 http://www.boost.org/doc/libs/1_43_0/doc/html/ref.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.