情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |
/**********************************/ /* クラスメンバーに対するポインタ */ /* coded by Y.Suganuma */ /**********************************/ #include <iostream> #include <math.h> /******************/ /* クラスXyの定義 */ /******************/ class Xy { int x, y; public: int z; static double r; Xy (int, int); // constructor double range (); }; /******************/ /* コンストラクタ */ /******************/ Xy::Xy(int a, int b) { x = a; y = b; } /**************/ /* 長さの計算 */ /**************/ double Xy::range() { z = x * x + y * y; return sqrt((double)z); } double Xy::r; // クラス内でstatic宣言された変数や関数は宣言にすぎず, // どこかで定義する必要がある /*************/ /* main 関数 */ /*************/ int main() { int Xy::*pz; // メンバー変数zに対するポインタ double(Xy::*prange)(); // 関数rangeに対するポインタ Xy *pxy; // クラスXyに対するポインタ double *pr; // メンバー変数rに対するポインタ //(クラス名がないことに注意) Xy a(1, 2); Xy::r = a.range(); // 通常の関数呼び出し std::cout << a.z << " " << Xy::r << std::endl; pz = &Xy::z; pr = &Xy::r; prange = &Xy::range; *pr = (a.*prange)(); // ポインタによる関数呼び出し(1) //(prにクラス名がないことに注意) std::cout << a.*pz << " " << *pr << std::endl; pxy = &a; *pr = (pxy->*prange)(); // ポインタによる関数呼び出し(2) std::cout << pxy->*pz << " " << *pr << std::endl; return 0; }
5 2.23607 5 2.23607 5 2.23607
情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |