// ( o4.C ) // 同種のオブジェクトをポインタで関連付ける // /* al bl cl 条件: bl = al*0.8, cl = bl*0.2 ---------------------- | A | B | C | A を変化させたら、A に関連する B を変化させる。 | | | | さらに B に関連する部品(C)があれば、それも自動 ---------------------- 的に変化させて行く。 */ #include class Shaft { double l ; // 自分自身の部品の長さ double k ; // 関連部品の長さの係数 Shaft* p ; // 関連部品へのポインタ public: Shaft( void ) { p = NULL ; l = 0.0 ; k = 0.0 ; } void set_rule( Shaft* ip,double ik ) { p = ip ; k = ik ; } double get_l() { return l ; } /* 方法その1*/ void set_l() ; // 注意せよ void change_l( Shaft* pp,double pl,double pk ) { pp->set_l( pl*pk ) ; } void set_l( double il ) { l = il ; // 自分の長さをセット if ( p != NULL ) { // 関連部品があれば変更して行く p->change_l( p,l,k ) ; } } /* 方法その2 void set_l( double il ) { // 再帰処理による方法 l = il ; if ( p != NULL ) p->set_l( l*k ) ; } */ } ; main() { Shaft* A = new Shaft ; // とりあえず全て、長さは0にセットする Shaft* B = new Shaft ; Shaft* C = new Shaft ; A->set_rule( B,0.8 ) ; // A に対する B の関連ル−ルをセットする B->set_rule( C,0.2 ) ; // B に対する C の関連ル−ルをセットする A->set_l( 100.0 ) ; // A の長さをセットする cout << "A : " << A->get_l() << "\n" ; cout << "B : " << B->get_l() << "\n" ; cout << "C : " << C->get_l() << "\n" ; delete A ; delete B ; delete C ; } /* [結果] A : 100 B : 80 C : 16 */