静岡理工科大学 菅沼ホーム 全体目次 演習解答例 付録 索引

第15章 クラスメンバーに対するポインタ(Javaを除く)

  1. 15.1 クラスメンバーに対するポインタ
  2. (プログラム例 15.1 ) クラスメンバーに対するポインタ

15.1 クラスメンバーに対するポインタ

  クラス内の変数やメンバー関数に対しても,ポインタを利用して参照できます.その方法の詳細については,以下の例を参照して下さい.

(プログラム例 15.1 ) クラスメンバーに対するポインタ

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

静岡理工科大学 菅沼ホーム 全体目次 演習解答例 付録 索引