17.3.2 節では、新しい stream クラスを派生する方法を説明しました。また、18.2 節では、streambuf クラスを派生する方法と、それら 2 つを結合する例を紹介しました。この節では、2 つを安全に結合する方法について、さらに詳しく検討します。
結合には次の 2 通りの方法があります。
最初の方法では、ストリームにバッファがなく、ANSI/ISO 標準によれば、親クラスコンストラクタかデストラクタ (ios、istream、ostream) でストリームバッファにアクセスすることになっています。この制約により、次のような派生も安全に行うことができます。
class DerivedStreamBuf : public streambuf { // ... . }; class DerivedOutputStream : public ostream { public: DerivedOutputStream():ostream(&dsb):ios(0){} // 1 // ... . private: DerivedStreamBuf &dsb; // ... . };
//1 | DerivedOutputStream
コンストラクタは、次の順序でその親コンストラクタを呼び出します。 ios() ostream(&dsb) DerivedStreamBuf () DerivedOutputStream() |
この順序を見ると、ios と ostream
が DerivedStreamBuf()
の実行前に作成されたことがわかります。したがって、ostream
コンストラクタで渡されたポインタ (&dsb)
は基本的に無効なポインタであり、これにアクセスすると致命的なエラーになります。派生
stream
にバッファがある場合、構築や削除の間にアクセスできるのは、バッファを提供する下位クラスだけになります。いずれの場合も、構築や削除の段階で基底クラスによるストリームバッファへのアクセスを明示的に禁止することで、致命的なエラーシーケンスを防ぐことができます。
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月