ページ 11

newで生成した複数のクラス

Posted: 2012年6月18日(月) 22:12
by 鬼丸飯店
シミュレーションRPGを制作している途中、行き詰まってしまったので質問させていただきます。
vc++ express 2010 , DXライブラリで制作しています。

コード:

class Character{
public:
	typedef struct{
		int x;
		int y;
	}Pos;
	void update();
	Pos getPosition(){ return mPos };
private:
	Pos mPos;
};

コード:

Character* mCharacter; 
mCharacter = Character[3];
このようにキャラクターを複数生成していたのですが、mCharacter[0]がupdate内でgetPosition()を行なっても得られるのはmCharacter[0]のmPosの値でした。
生成した3つのクラスがそれぞれ他のmPosの情報を得るにはどのように実装すれば良いのでしょうか?

Re: newで生成した複数のクラス

Posted: 2012年6月18日(月) 23:13
by beatle
newがソースコード中に出てきませんが、どういうことでしょうか?
仮に

コード:

Character* mCharacter; 
mCharacter = new Character[3];
の貼り付けミスだと仮定して話を進めます。
鬼丸飯店 さんが書きました:mCharacter[0]がupdate内でgetPosition()を行なっても得られるのはmCharacter[0]のmPosの値でした。
これは当たり前のように思えます。あるインスタンスのメソッドを呼び出したら他のインスタンスのメソッドまで(意図せず)呼び出せてしまう、というのは逆に考えるととても怖いことです。
Character::getPosition()は単に自分のmPosを返すようにしか実装されていませんから、mCharacter[0].getPosition()で得られる値は当然mCharacter[0].mPosです。
mCharacter[0].getPosition()を呼び出してmCharacter[1].mPosやmCharacter[2].mPosが戻ってくるなんてことは起こりません。

とりあえず生成した3つの「インスタンス」のmPosを得るには

コード:

Character::Pos pos0 = mCharacter[0].getPosition();
Character::Pos pos1 = mCharacter[1].getPosition();
Character::Pos pos2 = mCharacter[2].getPosition();
のようにすればいいでしょう。
(クラスとインスタンスという用語を使い分けたほうがいいと思います。特に今回のような質問の場合は。)