// ( t13.C ) // クラスのフレンド宣言 // #include // t1.C のコンテクスト・スイッチの例を、もう少し // 実際面で考えてみる。 class Draw { public: // [問題] void line() ; } ; // 線分を描く際のマウス入力点をマ−カ−と呼ぶこと // にする。マ−カ−の後処理は、デストラクタに任せ // ることは t1.C と同じで、マ−カ−の表示は Draw class Screen { // 注目! // の中の機能を使わなければならないとする。それに friend class Marker ; // Draw は Screen によって管理されるものとする。 Draw* draw ; public: // マ−カ−はとりあえず Draw や Screen とは別個に Screen() ; // 活動したい。だけど無関係で入られないという設定 ~Screen() ; // にある。 } ; Screen* screen ; /* Screen オブジェクトをグロ−バルで定義する */ class Marker { public: Marker() {} ~Marker() { cout << "マ−カを消しました\n" ; } void put() { screen->draw->line() ; // Screen の中の Draw オブジェクトに直接アクセス } // できるところが、フレンド指定の便利なところ。 } ; void Draw::line() { cout << "線分を表示しました\n" ; } Screen::Screen() { draw = new Draw ; } Screen::~Screen() { delete draw ; } void make_line() { Marker mark ; mark.put() ; // 1点目入力 mark.put() ; // 2点目入力。ル−チンを抜ける時に Marker のデストラクタが } // 働き、マ−カが自動で消される。 void main() { Screen* s = new Screen ; screen = s ; make_line() ; delete s ; }