/**********************************/
/* クラスメンバーに対するポインタ */
/* 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;
}