オブジェクト指向

友人のジムノ氏に、クラスの使い方がよくわからんという質問(?)が来ました。別々のクラスのプライベートメソッド同士を演算したい場合はどうするんだ?という質問だったかな?演算結果を何処に出すかによって違うのだが、口で説明するより実際のサンプルを見せたほうが遥かに早いので、ちゃっちゃとサンプルと作ってみました。

#include

using namespace std;


class XGuy
{
public:
	XGuy( int nHP ): m_nHP( nHP ){
		cout << "XGuyが現れた" << endl;
	}
	virtual ~XGuy(){}

	void Damage( int nDamage ){
		if( !Alive() ){
			cout << "XGuyは既に死んでいる" << endl;
			return;
		}
		m_nHP -= nDamage;
		if( !Alive() ){
			cout << "XGuyは死んでしまった!!" << endl;
			return;
		}
	}

	bool Alive( void ){ return m_nHP > 0; }
private:
	int m_nHP;
};

class BOB
{
public:
	BOB( int nPower ):m_nPower( nPower ){
		cout << "BOBが現れた" << endl;
	}
	virtual ~BOB(){}

	void kick( XGuy* pXGuy ){
		cout << "BOBの攻撃!!" << endl;
		int nDamage = m_nPower + (( rand() % 20 ) - 10 );
		if( rand() % 4 == 0 ){
			cout << "痛恨の一撃!!" << endl;
			nDamage *= 2;
		}
		cout << "XGuyは" << nDamage << "のダメージを受けた!!" << endl;
		pXGuy->Damage( nDamage );
	}


private:
	int m_nPower;
};



int main()
{
	BOB* pBOB = new BOB( 100 );
	XGuy* pXGuy = new XGuy( 1000 );

	cin.get();

	while( pXGuy->Alive() ){
		pBOB->kick( pXGuy );
		cin.get();
	}

	delete pBOB;
	delete pXGuy;

	return 0;
}

久々にboost抜きで書いたら最初deleteを書くのを忘れてしまいました(ぉ

このソースの場合、BOBがプライベートメソッドとしてPOWERを持っており、XGuyがHPを持っている。BOBのPOWERに応じてXGuyのHPが減っていくという、まあ、ゲームなんかではしょっちゅうあるシチュエーションである。一番簡単なのは片方のクラスのポインタをもう一つのクラスに投げ入れちゃえば良い。あとはそのポインタからメンバ関数を呼び出せばよい。

ちなみにこのサンプルソースはフィクションです。どこかの現実と酷似していたとしてもそれはただの偶然であり、深く考えてはいけません。