## 18.3 入出力ストリームオブジェクトとストリームバッファオブジェクトの結合

17.3.2 節では、新しい stream クラスを派生する方法を説明しました。また、18.2 節では、streambuf クラスを派生する方法と、それら 2 つを結合する例を紹介しました。この節では、2 つを安全に結合する方法について、さらに詳しく検討します。

結合には次の 2 通りの方法があります。

- istream や ostream などの、streambuf を持たない ios の下位クラスから派生させます。それ自体が派生型の外部 streambuf を与えます。
- ifstream や ofstream などの、streambuf を提供する ios の下位クラスから派生させます。

最初の方法では、ストリームにバッファがなく、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 月