// ( o15.C ) // メッセ−ジ通信とデ−タベ−ス−その2 // #include // その1を別な方法でやってみる。その1も2も #include "math.h" // 移動処理は不完全であることを断わっておく。 class Point { int x ; int moved ; // 動かされたら1、そのままなら0 public: Point( int xx ) { x = xx ; moved = 0 ; } void display() { cout << "Point : " << x << endl ; } int get_x() { return x ; } void move( int mx ) { x = mx ; moved = 1 ; } int move_state() { return moved ; } void init_state() { moved = 0 ; } } ; class DB { // デ−タベ−スだけを定義するクラス static int count ; static Point* a[5] ; public: DB() { count = 0 ; } void add_Point( Point* p ) { a[count] = p ; count++ ; } void report() { for ( int i=0;idisplay() ; } int get_count() { return count ; } Point* get_Point( int i ) { return a[i] ; } } ; class Access { // デ−タベ−スをアクセスするためのクラス DB* db ; public: Access( DB* b ) { db = b ; } void report() { db->report() ; } // 総なめで移動対象を探す方法である。非常 void move_object() { // にあほくさい従来型のやり方であるが、多 int max = db->get_count() ; // 分これが正解である。その1の方法はス− // マ−トだが、再帰処理するのでスタックに for ( int k=0;kget_Point(i) ; Point* b = db->get_Point(j) ; if (( a->move_state()==1 )||( b->move_state()==0 )) continue ; int interval = abs( b->get_x() - a->get_x() ) ; if ( interval < 8 ) a->move( b->get_x()-8 ) ; } } } for ( int i=0;iget_Point(i))->init_state() ; } } ; main() { Point* a = new Point( 10 ) ; DB db ; db.add_Point( a ) ; Point* b = new Point( 20 ) ; db.add_Point( b ) ; Point* c = new Point( 30 ) ; db.add_Point( c ) ; Point* d = new Point( 40 ) ; db.add_Point( d ) ; db.report() ; c->move( 25 ) ; // c を25に移動する Access adb( &db ) ; adb.move_object() ; adb.report() ; }