代码之家  ›  专栏  ›  技术社区  ›  Ogre Psalm33

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

  •  2
  • Ogre Psalm33  · 技术社区  · 14 年前

    RAII

    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\u ios的拷贝构造函数是私有的,它位于流中。有没有使用RAII的简单的PLAN C++/STL解决方案,或者我需要得到一些类型的智能指针吗?

    6 回复  |  直到 14 年前
        1
  •  3
  •   Joel    14 年前

        2
  •  5
  •   Victor Nicollet    14 年前

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

    boost::ptr_vector 在这种情况下,作为指针的向量。

        3
  •  4
  •   anon anon    14 年前

    流对象不能被复制,因此您不能创建它们的容器—您必须使用某种类型的指针。

    deque <ofstream *> files;
    files.push_back( new ofstream );
    // and later delete it, or use a smart pointer
    
        4
  •  3
  •   Jerry Coffin    14 年前

    你可能需要一个智能指针。容器的要求之一(至少在C++中)是把东西放在容器中,它必须是可复制的——流是

        5
  •  2
  •   bradgonesurfing    14 年前

    这股气流把雷伊烤熟了。ofstream的析构函数自动关闭文件,这样您就不需要这样做了。

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

    不要使用std::auto\u ptr容器!

        6
  •  0
  •   Scharron    14 年前

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