## 11.3 簡単な抽出子と挿入子の例

入出力ストリームの読み書きの規約に基づいて、次のように日付オブジェクトを挿入、抽出します。

>     date birthday(2,6,1952);
>     cout << birthday << '\n';

または、

>     date aDate;

>     cout << '\n' << "Please, enter a date (day month year)" << '\n';
>     cin  >> aDate;
>     cout << aDate << '\n';

次の段階では、`date` オブジェクトの挿入子および抽出子としてシフト演算子を実装します。次に示すのは、クラス `date` の抽出子です。

>     template<class charT, class Traits>
>     basic_istream<charT, Traits>&                                 //1
>     operator>> (basic_istream<charT,Traits>& is,                  //2
>                 date& dat)                                        //3
>     {
>      is >> dat.tm_date.tm_mday;                                   //4
>      is >> dat.tm_date.tm_mon;
>      is >> dat.tm_date.tm_year;
>      return is;                                                   //5
>     }

//1 | 抽出子 (挿入子) への戻り値は、1 つの式で複数の抽出を実行するためのストリームに対する参照です。
//2 | 最初のパラメータは、通常はデータの抽出元になるストリームです。
//3 | 2 番目のパラメータは、ユーザー定義型のオブジェクトに対する参照または代替のポインタです。
//4 | `date` クラスの非公開データにアクセスするには、抽出子をクラス `date` のフレンド関数として宣言します。
//5 | 戻り値は、データの抽出元のストリームです。

抽出子は、`date` クラスの非公開データメンバーにアクセスするので、`date` クラスのフレンド関数として宣言します。挿入子の場合も同じです。次に示すのは、`date` クラスのさらに完全な例です。

>     class date {
>     public:
>        date(int d, int m, int y);
>        date(tm t);
>        date();
>        // より多くのコンストラクタと有用なメンバー関数

>     private:
>        tm tm_date;

>     template<class charT, Traits>
>     friend basic_istream<charT, Traits> &operator >>
>       (basic_istream<charT, Traits >& is, date& dat);

>     template<class charT, Traits>
>     friend basic_ostream<charT, Traits> &operator <<
>       (basic_ostream<charT, Traits >& os, const date& dat);
>     };

次に示すように、挿入子の構築方法も同じです。唯一の違いは、日付オブジェクトに定数参照を渡す点です。これは、挿入子は出力するオブジェクトを変更しないためです。

>     template<class charT, class Traits>
>     basic_ostream<charT, Traits>&
>     operator << (basic_ostream<charT, Traits >& os, const date& dat)
>     {
>      os << dat.tm_date.tm_mon << '-';
>      os << dat.tm_date.tm_mday << '-';
>      os << dat.tm_date.tm_year ;
>      return os;
>     }

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

OEM リリース, 1998 年 6 月