0

コンストラクターで istream 参照を受け入れるクラスがあります。コンストラクターに一時的なオブジェクトが渡された場合、myclass obj(ifstream("filename"));その ifstream の寿命は長くなりobjますか? クラス内の参照またはポインタに割り当てられているかどうかに依存しますか?

例えば:

class test
{
public:
    istream *p;
    test(istream &is)
    {
        p = &is;
        cout << "a constructor" << endl;
    }
    ~test()
    {
        cout << "a destructor" << endl;
    }
    bool isgood()
    {
        return p->good();
    }
};

int main()
{
    test test(ifstream("test.cpp"));
    cout << test.isgood() << endl;
}

出力:

a constructor
1
a destructor

出力がファイルが良好であると言っているからといって、それが破壊されたのか、それとも何なのかわかりません。これをカバーする規格の一部があれば、私に知らせてください。ありがとう

4

1 に答える 1

2

申し訳ありませんが、コメントするのに十分な評判がありません。

一時的istreamなものはコンストラクターでのみ有効です。のアドレスを使用しistreamてポインターの値を設定しても、コンストラクターが戻ると使用できなくなります。コンストラクターの呼び出し後、一時的な ifstream は既に閉じられ、破棄されています。したがって、@ Joshが述べたように、ポインターはガベージを指します。ファイル名をコンストラクターに渡すようにコードを変更し、ファイル名を使用してメンバーを初期化することができますifstream(ifstream へのポインターではありません)。その後、オブジェクトの存続期間を通じてストリームを使用できます。

于 2014-02-26T22:56:26.280 に答える