※ ChatGPTを利用し、要約された質問です(原文:ストリームオブジェクトによるエラー判定)
ストリームオブジェクトによるエラー判定
このQ&Aのポイント
C++でストリームオブジェクトを使用する際に、エラー判定を行う方法について質問があります。
林晴比古著「明快入門C++(シニア編)」(2008年8月、初版)には、ストリームオブジェクトを使用したエラー判定の方法が記載されています。
質問者は、記述例として示されている(fout)と(!fout)でのエラー判定方法が理解できないと述べています。
林晴比古著「明快入門C++(シニア編)」(2008年8月、初版)を読んでいるのですが、297ページに以下の記述があるのです。
================================
ストリームオブジェクトを使って何かの処理を行うと、その戻り値は自身のアドレス(this)になります。巧みな演算子多重定義が行われているので、エラー判定は簡単です。前ページのエラー判定関数は必要に応じて使うだけでかまいません。たとえばファイルオープンの記述例は次のようにできます。
ofstream fout; //出力用オブジェクト
fout.open("mydata.txt"); //ファイルをオープン
if(fout){ //正しいなら
・・・
}
if(!fout){ //エラーなら
・・・
}
この(fout)と(!fout)で判定できるのは、basic_iosの中で次のような変換関数(変換演算子)と演算子多重定義が行われているからです。記述は一例です。
//fail()でなければ真を返す
operator void*() const
{
return (fail() ? 0 : (void*)this);
}
//fail()なら真を返す
bool operator!() const
{
return (fail());
}
================================
この説明で「()演算子」と「!()演算子」を多重定義しているらしい事は推定できるのですが、なぜ単に「!()演算子」を{ return (fail()); }と多重定義する等だけで、(fout)と(!fout)でエラー判定できるのかが分からないのです。
どなたかお教え頂けませんでしょうか。よろしくお願いいたします。
お礼
Tacosan様 さっそく的確なご回答を頂きまして、有難うございました。 理解できました。 「変換関数」がC++の専門用語だと言う事を知らなかったため(本書籍の403ページに記述がありました)、変換関数の書式 operator 型() { return 式;} を、演算子の多重定義をしているものだと勝手に考えてしまっていました。 「!」演算子の話は言われてみればその通りで、(fout)の処で初めに悩んでしまい、頭が混乱していました。 どうも有難うございました。