Rogue Wave バナー
前へマニュアルの先頭へContents次へ

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

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

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

最初の方法では、ストリームにバッファがなく、ANSI/ISO 標準によれば、親クラスコンストラクタかデストラクタ (iosistreamostream) でストリームバッファにアクセスすることになっています。この制約により、次のような派生も安全に行うことができます。

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()

この順序を見ると、iosostreamDerivedStreamBuf() の実行前に作成されたことがわかります。したがって、ostream コンストラクタで渡されたポインタ (&dsb) は基本的に無効なポインタであり、これにアクセスすると致命的なエラーになります。派生 stream にバッファがある場合、構築や削除の間にアクセスできるのは、バッファを提供する下位クラスだけになります。いずれの場合も、構築や削除の段階で基底クラスによるストリームバッファへのアクセスを明示的に禁止することで、致命的なエラーシーケンスを防ぐことができます。


前へマニュアルの先頭へContents次へ

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。


OEM リリース, 1998 年 6 月