ページ 11

GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 16:55
by シャイニング生ごみ
こんにちは シャイニング生ごみと申します。
使用言語はC++で半年くらいやっています。
開発環境はVisualC++2008 Dxlibrary使用です。

今回皆様にお聞きしたい事は管理人様が龍神録で使用している
GetHitKeyStateAll_2()等の他のcppにまたがって使用するような関数についてなのですが

コード:

unsigned char state_key[256];

int GetHitKeyStateAll_2()
{
	char GetHitKeyStateAll_Key[256];
	GetHitKeyStateAll( GetHitKeyStateAll_Key );
	for( int i = 0; i < 256; i++ )
	{
		if( GetHitKeyStateAll_Key[i] == 1 )
		{
			state_key[i]++;
		}
		else
		{
			state_key[i] = 0;
		}
	}
	
	return 0;
}

CheckStateKey( unsigned char Handle )
{
	return state_key_[ Handle ];
}

このように記述されているかと思います。
しかしこのstate_keyの配列はグローバルな場所で宣言されてしまっているのが嫌で
このGetHitKeyStateAll_2()、CheckStateKeyとともに静的メンバにしてしまいstate_key[256]をprivateにし、
クラスに収めてしまおうと思ったのですが、staticで宣言したメンバ配列を使おうとするとエラーが出ます。
どうも初期化を行いなさいということだとは思うのですが静的メンバ配列を初期化とはどうすればよいのでしょうか。

ちなみに今は代用としてシングルトンで実装しているのですが、使い方が適当ではない気がしてなりません。
どうか皆様ご助力お願いします。

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 18:03
by Ciel
あまり状況がわからないのですが、
cppファイルの方の関数外のところで、

unsigned char クラス名::state_key[256];

って書いてもだめでしょうか?

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 18:21
by サウス
24行目のstate_key_[ Handle ]はstate_key[ Handle ]の間違いじゃないですか?

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 18:24
by ISLe
Cielさんが書かれているようにクラスの静的メンバ変数はどこかに実体の定義が必要です。
クラスにしなくてもstate_keyの宣言にstaticを付けて、ちょうど質問に書かれているコードでひとつのソースファイルに分けてしまえば良いと思いますけど。

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 18:34
by シャイニング生ごみ
Cielさん、サウスさん、ISLeさん、皆様解答して下さりありがとうございます。
御指摘のとおり、初期化しろという意味ではなく実体を定義しろ!!というエラーであったようです。
サウスさんに御指摘していただきましたアンダーバーは書き込むときに誤って入力してしまったものですすみませんでした。

ISLeさんのおっしゃっていた「クラスにしなくてもstate_keyの宣言にstaticを付けて、ちょうど質問に書かれているコードでひとつのソースファイルに分けてしまえば良いと思いますけど。」とおっしゃられているのですがstate_keyの宣言をクラスのprivateにしなくては外部から操作できてしまうのではないでしょうか。間違っておりましたら申し訳ありません

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 19:41
by Dixq (管理人)
質問者さんがやりたいことはシングルトンではないかと思いますが、いかがでしょうか?
グローバル変数のC++版とでも言うべきものです。
http://www.google.co.jp/search?hl=ja&so ... C%E7%B4%A2

せっかくグローバル変数を削減しようとしているのにシングルトンにしてしまっては意味が無いかもしれませんが、
IF等、一つしか存在しえない物についてはシングルトンを使う場合もあると思います。
ただ今回の場合キーの入力状態ということで、2Pコントローラーも存在するなら気を付けて使わないといけないかもしれません。

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 20:16
by dic
静的メンバ変数にするということで

コード:

class hogehoge
{
   static int key[256];
public:
  GetState()9; いろいろ
}
ということでしたら

コード:

hogehoge h;
h.GetState();
で使えますけどね
違ってたらすいません スルーしてください

静的メンバ変数が好きな方がいらっしゃることは知ってますので

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年2月27日(日) 21:14
by サウス
> ちなみに今は代用としてシングルトンで実装しているのですが、使い方が適当ではない気がしてなりません。

Dixqさんも言っている通り2Pコントローラの存在を意識するならシングルトンを使うのは適切じゃない気がしますね。
キーボード状態取得のクラス化なら十分意味はあると思いますが...

ただ単純にstate_key[256]がグローバル変数に居るのが気に入らないという理由ならシングルトンを使わなくても
C++なら名前空間を使えます。
C言語でもグローバル領域に static state_key[256]と宣言すればファイル内でしか有効にならないので影響範囲を減らす事ができます。

参考
http://www.geocities.jp/ky_webid/cpp/language/018.html
http://www.geocities.jp/ky_webid/c/032.html#static

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年3月01日(火) 13:44
by シャイニング生ごみ
Dixqさん、dicさん、サウスさん 解答して下さりありがとうございます。
2Pの操作も考慮しているのでシングルトンは止めようと思います。dicさんにアドバイス頂いたようにprivate内にstate_key[256]を置き、public内で関数を宣言するようにしようかと思います。また、名前空間を使う等の方法は見落としていたのでもう少し考えて実装することにします。参考URLまで張って頂きまして本当にありがとうございました。

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年3月02日(水) 00:09
by Dixq (管理人)
おや・・質問文の最後の2行を完全に見落としていたようです・・。
的を得ない回答をしてすみません。

ところでキーボード入力による変化を必要とするクラスはそんなに膨大な量にはならないと思います。
UI関連は一つのUIクラスにしておいて、必要なクラスにUIクラスの実体のポインタを与えるなどして対応してみてはいかがでしょうか。

Re: GetHitKeyStateAll_2等グローバルで使いたい関数について

Posted: 2011年3月02日(水) 17:28
by シャイニング生ごみ
Dixqさん またもや解答して頂きましてありがとうございます。今までKeyクラスとしていたのですが、仰られたとおりにもう少し広げてUIクラスで実装しても良いような気もしてきました。しかし私のコーディングの設計が悪いのかもしれませんが現段階のKeyクラスを使うクラスが何故か大量にあるのでどうしたものか・・・。コーディングの設計等についてはまた別のトピックでお聞きするかもしれませんがよろしくお願いします。