なぜ私がのstd :: ifstreamsのはstd ::スタックを作成することはできませんか?
質問
以下ではない仕事をする理由ます:
#include <iostream>
#include <fstream>
#include <stack>
std::stack<std::ifstream> s;
-PT
解決
std::stack
(すべてのSTLコンテナなど)は含まタイプが「割り当て可能」であることを必要とします。 STL-話すには、そのそれはコピーコンストラクタとoperator=
を持たなければならないことを意味します。 std::ifstream
は、どちらもこれらの持っています。
あなたがコピーできるようにしたくない理由をあなたは想像できると割り当てI / Oストリーム。同じストリームの2つのコピーがあるときにどうするかのセマンティクスは明らかではありません。 1つのコピーへの書き込みや読み出しが他のコピーの位置に影響を与えるべきか?近くに他の一つのストリームを閉じるべきでしょうか?など。
あなたは、「std::ifstream
sのコンテナ」を持つようにしたい場合は、次に何が本当にするべきこと「std::ifstream*
sのコンテナ」です。非constポインタは常に割り当て可能です。注意すべき点はもちろん、この場合には、コンテナがあなたのためにことを行うことはありませんので、あなたは、コンテナを破壊する前にポインタを自分で削除していることを確認しなければならないということです。
他のヒント
あなたはtecxhnicaly標準コンテナにそれらを置くことができます。
しかし、我々はストリームへのポインタをstoreingであることを周囲に取得することができます。しかし、あなたは標準コンテナで(それらが動的に割り当てられている場合は特に)ストリームへのポインタを格納したくありません。我々は解決策をブーストに目を向けるようにします。
ブーストは、ポインタのコンテナの概念があります。
これは、動的にオブジェクトを割り当て、そのオブジェクトの所有権を取得して、オブジェクト(のではなくポインタ)であるかのようにあなたの動的オブジェクトへのアクセスを与えるポインタ容器内のポインタを格納することを可能にします。
ポインタのコンテナが所有権を取得するので、あなたはドン;トンの必要性をオブジェクトの削除を心配します。コンテナはそれを行います。
それはオブジェクトではなくポインタとして含まれるオブジェクトへのアクセスを提供しますので、それはあなたが(ポインタのコンテナでcampared)より自然fashonで標準的なアルゴリズムでストリームを使用することができます。
ここタイラーのバックアップます。
(投票+1後)STLコンテナは、すべてあなたがそれらを与えるオブジェクトの場所にコピーを作成します。あなたがしたい場合は、参照カウントとその他もろもろと巧妙に作成されたコピーコンストラクタとdestructursで彼らに特別なオブジェクトを与えることによって、これに対処することができます。
一般的に、私はあまりにも多くの問題を見つけます。ただ、経験則として、コンテナだけで小さなオブジェクトを使用します。あなたは、構造体またはクラスのスタック、利用したい場合は、のポインタの彼らに代わります。