2

ofstreamオブジェクトのSTLコンテナで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_iosのコピーコンストラクターはプライベートです。RAIIを使用してこれを行うための簡単なplianC++ / STLソリューションはありますか、または何らかのタイプのスマートポインターを関与させる必要がありますか?

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

おそらく、何らかのスマートポインタを使用する必要があります。コンテナーの要件の1つ(少なくとも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 に答える