2011-08-11 10 views
2

は次のとおりです。私ははstdに私のエラーメッセージeritherをリダイレクトしたい :: CERRまたはcommand-lineに応じて、ファイル へ引数。ログファイルがない場合、プログラムは画面にエラーメッセージを出力する必要があります。ここ は私のアプローチです:私はSTDを渡すことができます:: ostreamに&STDを期待する関数に::私は何をしようとしているofstreamの

私はどちらかにポインタを渡すことができるように機能 SetLogFileStream またはタイプ T1 の引数の型がどうあるべきか
class A { 

    void SetLogFileStream(T& err_outstream); 
}; 

//main.cpp

A a; 
std::string filename; 
T1* t1; 
if(argc>2) { 
    filename = argv[1]; //if provided by command line 

    std::ofstream fp(filename); 
    t1 = &fp; 

} 
else { 

    std::ostream* err_outstream = &std::cerr; 
    t1 = err_outstream; 
} 

a.SetLogFileStream(t1); 

ファイルまたはにstd::cerr

答えて

2

は、このような方法を宣言します。

class A { 
    void SetLogStream(std::ostream& err_outstream); 
}; 

あなたのコードにはいくつかの問題があります。開いたファイルストリームが有効範囲外になり、破棄されます。このように修正する必要があります:

std::ofstream f; // <-- this have to remain in scope while you use it for 'a' 
A a; 

if(args > 2) { 
    f.open(argv[1]); 
    a.SetLogStream(f); 
} else { 
    a.SetLogStream(cerr); 
} 
+0

良いキャッチ、私はそれを逃した。 – john

3

いいえ。しかし、その逆です。 を、std::ostream&、またはstd::ofstream*を期待する関数に、std::ostream*を期待する関数に渡すことができます。だからあなたの関数はstd::ostream refかポインタを受け入れるべきです。

1

タイプはstd :: ostreamである必要があります。関数のパラメータが参照であり、引数がポインタであるため、コーディングしたときとまったく同じように動作しません。しかし、それを修正する(いずれかの方法)とそれは動作します。

関連する問題