ページ 11

ステートパターン時のスコープの問題とファイル分割について

Posted: 2016年7月25日(月) 00:26
by Biginer01
C++でStateパターンを使ったキャラクターの制御をしているのですが、StateManagerクラス(Player本体クラス等)とStateクラス(Attackクラス等)のクラス間でStateManager側のprivateを含むメンバにアクセスできるようにしたいと思っています。

現在はPlayerMemberみたいなメンバのポインタをいれた構造体を引数で各Stateに渡していますが、これだと一々メンバが増えたり減ったりするたびに、構造体も書き換えで面倒なのでStateをStateManagerの「friendクラス」または「Innerクラス」として扱おうかと思っています。

イメージ的にInnerで綺麗にかけたらいいな~と思うのですが、InnerだとStateManagerクラス内に書かなくてはならなく、ヘッダのファイル分割ができないと思うのですが、1つのヘッダファイルがクッソ長くなってしまうのがどうしても許せません。
解決方法はありませんか?

イメージはこんな感じです。
~~~~~Outer.h~~~~~~~~
class Inner; //前方宣言
class Outer
{
public:
Outer();
private:
int m_outerMember;
Inner m_Inner;
};

~~~~~~~~Inner.h~~~~~~~
//ネームスペースみたいに
class Outer {
class Inner
{
public:
Inner(Outer& outer)
private:
Outer& m_outer;
};
};

Re: ステートパターン時のスコープの問題とファイル分割について

Posted: 2016年7月25日(月) 10:02
by usao
>InnerだとStateManagerクラス内に書かなくてはならなく、ヘッダのファイル分割ができないと思うのですが、1つのヘッダファイルがクッソ長くなってしまうのがどうしても許せません。

ヘッダを分けることはできるのではないでしょうか.

コード:

//Manager.h
class Manager
{
public:
	Manager() : m_PrivateData(600) {}
public:
	class Inner;
private:
	int m_PrivateData;
};

コード:

//Inner.h
#include "Manager.h"

class Manager::Inner
{
public:
	Inner( const Manager &rM ) : m_rManager(rM) {}
public:
	int GetDataOfManager()
	{	return m_rManager.m_PrivateData;	}
private:
	const Manager &m_rManager;
};