0

私のC++プログラムは、多くのファイルポインターを使用し、多くのreturnステートメントを持っています。
開いているすべてのファイルポインタを閉じずにreturnステートメントに到達しないようにするために、returnステートメントに到達すると、すべてのオブジェクトのデストラクタが自動的に呼び出されることが保証されているという前提に基づいて、このクラスを作成しました。

私の仮定は本当ですか?
そして、それは良いコードですか?

File_pointer.cppのコンストラクタとデストラクタ

File_pointer::File_pointer(string filename)
{
    fptr.open(filename.c_str());
};

File_pointer::~File_pointer()
{
    fptr.close();
};



実装例

int main ()
{
    File_pointer myfile("myfile.txt");
    int x = 2;
    switch(x)
    {
        case 1:     return x;
        case 2:     return x;
        default:
            break;
    };

return 0;

}
4

3 に答える 3

3

これは本当ですか?

はい; 自動保存期間を持つすべてのオブジェクトは、スコープ外になるとデストラクタが呼び出されます。

明確にするために、自動オブジェクトは動的に割り当てられなかった非静的ローカルオブジェクトです。

そして、それは良いコードですか?

それは主観的です。しかし、私が言うことは、デストラクタを自動的に呼び出すためにスコープに依存することは非常に一般的なC ++イディオムであり、リソース取得の奇妙な名前で知られているのは初期化(RAII)です。

のようなクラスはstd::ofstreamすでにRAIIを使用しています。それらのデストラクタは自動的にファイルを閉じます。したがって、たとえば、がの場合、ラッパークラスは完全に不要ですfptrstd::ofstream

于 2012-05-19T21:10:56.863 に答える
0

RAII、確かに。

または、リソースをラップできる場合は、ブーストスマートポインターを使用します。どんなに単純であっても、自分で行うことよりも常に優れたテストを行います。

于 2012-05-19T21:13:12.377 に答える
0

私はそれがあなたのクラスfptrFILEポインタだと思いますFile_pointer

あなたのアプローチはRAIIパラダイムに近いものですが、エラーを適切に処理していないことを指摘しておく必要があります。

たとえば、fopen失敗した場合はどうなりますか?

于 2012-05-19T21:13:58.390 に答える