簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM