ページ 11

staticメンバ変数を継承して利用する

Posted: 2011年3月15日(火) 13:23
by dic
件名のとおりstaticメンバ変数を継承して利用するときで、確認したいです

コード:

class	CSystem
{
protected:
	static	int		m_iValue;
public:
	int		GetValue() { return m_iValue; }
	void	SetValue( int v ) { m_iValue = v; }
};

class	CTask	:	public	CSystem
{
	char	m_szName[1024];	//	タスクの名前
	int		g_iNumber;		//	タスクの番号
public:
	CTask( char *name );
	~CTask();
	void	Draw( int x, int y );
};

vector<CTask*>	g_mvTask;
//==================================================================
//	初期化
void	Init()
{
	CTask	*task;

	task = new CTask( "タスク1" );
	g_mvTask.push_back( task );

	task = new CTask( "タスク2" );
	g_mvTask.push_back( task );

	task = new CTask( "タスク3" );
	g_mvTask.push_back( task );

	task = new CTask( "タスク4" );
	g_mvTask.push_back( task );

	task = new CTask( "タスク5" );
	g_mvTask.push_back( task );
}

void	Loop()
{
		g_mvTask.at(0)->SetValue( rand()%255 );
}


とあるとき Loop関数で g_mvTask[0] で SetValueを使って CSystem::m_iValue の値を変更したとき
g_mvTask[1].m_iValue
g_mvTask[2].m_iValue
g_mvTask[3].m_iValue
g_mvTask[4].m_iValue
の値も全部変更になるんですが、これでよかったでしょうか?

確認はしたのですが、偶然だったら怖いのでこれで合っているかどうかを聞きたいです
使い方としては タスク1、タスク2、タスク3、タスク4、タスク5 で同じ変数を共有、使用したいのです

Re: staticメンバ変数を継承して利用する

Posted: 2011年3月15日(火) 13:34
by maru
dic さんが書きました:件名のとおりstaticメンバ変数を継承して利用するときで、確認したいです
とあるとき Loop関数で g_mvTask[0] で SetValueを使って CSystem::m_iValue の値を変更したとき
g_mvTask[1].m_iValue
g_mvTask[2].m_iValue
g_mvTask[3].m_iValue
g_mvTask[4].m_iValue
の値も全部変更になるんですが、これでよかったでしょうか?

確認はしたのですが、偶然だったら怖いのでこれで合っているかどうかを聞きたいです
使い方としては タスク1、タスク2、タスク3、タスク4、タスク5 で同じ変数を共有、使用したいのです
静的なメンバ変数はクラスで一つのデータしか持たず、複数のオブジェクトで共有されますので、正しい結果です。
なお、
int CSystem::m_iValue = xxx;
という変数定義がないとリンクエラーになりそうですが。

Re: staticメンバ変数を継承して利用する

Posted: 2011年3月15日(火) 13:45
by dic
>>maruさん
そうなんですね 安心しました

>>int CSystem::m_iValue = xxx;
>>という変数定義がないとリンクエラーになりそうですが。
抜き出し忘れていました