// ( o3.C ) // これはオブジェクト指向といえるのか? // /* 問題:円が幾つかあって、ある1つの円の半径を変えたとする。 その円と同じ中心の円があれば、自動的に半径を変更させる。 */ #include // これで自動的と言えるのか?? class Circle { int x ; int radius ; public: Circle( void ) { x = 0 ; radius = 0 ; } void set( int a,int c ) { x = a ; radius = c ; } int get_radius() { return radius ; } int get_coor() { return x ; } void set_radius( int newr ) { radius = newr ; } } ; Circle* CC = new Circle[5] ; // Circle( void ) 型で初期化される class DBASE { public: DBASE() {} Circle* Get_Circle( int fr ) { for ( int i=0;i<5;i++ ) if ( CC[i].get_radius() == fr ) return &CC[i] ; return NULL ; // 見つからなかった } ; void Change_Radius( int,int ) ; } ; void DBASE::Change_Radius( int or,int add_r ) { Circle* temp = Get_Circle( or ) ; // 指定の径の円を探す if ( temp == NULL ) return ; temp->set_radius( or+add_r ) ; // 先ず探した円の径を変更する int tx = temp->get_coor() ; // 同心円の径も変更する。X座標のみ比較 for ( int i=0;i<5;i++ ) { if (( temp != &CC[i] )&&( CC[i].get_coor() == tx )) { int tr = CC[i].get_radius() ; CC[i].set_radius( tr+add_r ) ; } } } // 注意:inline void DBASE とすると、void 型の return はエラ−になる。 main() { CC[0].set( 1,10 ); CC[1].set( 2,20 ); // cout << CC[3].get_coor() << "\n" ; CC[2].set( 1,30 ); CC[3].set( 4,40 ); // Circle* temp = p.Get_Circle( 10 ) ; CC[4].set( 1,50 ); // cout << temp->get_coor() << "\n" ; DBASE p ; p.Change_Radius( 10,100 ) ; // 半径 10 の円に径を 100 足す for ( int i=0;i<5;i++ ) cout << i << " : " << CC[i].get_radius() << "\n" ; } /* [結果] 0 : 110 1 : 20 2 : 130 3 : 40 4 : 150 */