// ( t1.C ) // コンテクスト・スイッチ // #include // デストラクタの性質を使って、じょうずに後処 // 理をする方法。"C MAGAZINE" からヒントを得た。 // 例題1 int point[2] ; class Mark { public: Mark() {} ; // この場合コンストラクタは意味がない。インス ~Mark() { // タンスを生成するためだけのものである。 point[0] = 0 ; point[1] = 0 ; // デストラクタで後始末をしてしまう。 } } ; void make_line() // この例はたとえばCADで線分を描く際2点を { // マウスでヒットする。ヒット点は表示されるよ Mark erase ; // うになっているとする。線分作成の処理が終わ // ったら、点は消去しなければならない。この処 point[0] = 1 ; // 理をデストラクタで自動的におこなわせようと point[1] = 2 ; // いうものである。 } ; /* ル−ル:point[] = 1 で表示、= 0 で消去とする */ // 例題2 /**********************************************/ class Marker { /* こっちの方が、もっと賢いやり方かもしれない */ static int count ; /**********************************************/ static int point[2] ; public: Marker() { count = 0 ; } ; ~Marker() { point[0] = 0 ; point[1] = 0 ; cout << "全ての点を消去しました\n" ; } void disp_point() { point[count] = 1 ; count++ ; cout << "1個点を表示しました\n" ; } } ; void make_circle() { Marker dp ; // Marker* dp = new Marker ; ではダメ dp.disp_point() ; // ル−チンの最後に delete dp ; を入れる必要がある。 dp.disp_point() ; // new したのはプログラマの責任で delete しなければ } ; // ならない。 main() { make_line() ; cout << "Point-1 : " << point[0] << endl ; // Point-1 : 0 cout << "Point-2 : " << point[1] << endl ; // Point-2 : 0 make_circle() ; } /* [結果] 1個点を表示しました 1個点を表示しました 全ての点を消去しました */