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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シャイニング生ごみ

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

#1

投稿記事 by シャイニング生ごみ » 8年前

こんにちは シャイニング生ごみと申します。
使用言語は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で宣言したメンバ配列を使おうとするとエラーが出ます。
どうも初期化を行いなさいということだとは思うのですが静的メンバ配列を初期化とはどうすればよいのでしょうか。

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

アバター
Ciel
記事: 252
登録日時: 9年前

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

#2

投稿記事 by Ciel » 8年前

あまり状況がわからないのですが、
cppファイルの方の関数外のところで、

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

って書いてもだめでしょうか?
最後に編集したユーザー Ciel on 2011年2月27日(日) 18:26 [ 編集 1 回目 ]
oui C'est la Vie♪

アバター
サウス
記事: 78
登録日時: 9年前
住所: 千葉
連絡を取る:

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

#3

投稿記事 by サウス » 8年前

24行目のstate_key_[ Handle ]はstate_key[ Handle ]の間違いじゃないですか?

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

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

#4

投稿記事 by ISLe » 8年前

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

シャイニング生ごみ

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

#5

投稿記事 by シャイニング生ごみ » 8年前

Cielさん、サウスさん、ISLeさん、皆様解答して下さりありがとうございます。
御指摘のとおり、初期化しろという意味ではなく実体を定義しろ!!というエラーであったようです。
サウスさんに御指摘していただきましたアンダーバーは書き込むときに誤って入力してしまったものですすみませんでした。

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

アバター
Dixq (管理人)
管理人
記事: 1659
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

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

#6

投稿記事 by Dixq (管理人) » 8年前

質問者さんがやりたいことはシングルトンではないかと思いますが、いかがでしょうか?
グローバル変数のC++版とでも言うべきものです。
http://www.google.co.jp/search?hl=ja&so ... C%E7%B4%A2

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

dic
記事: 563
登録日時: 9年前
住所: 宮崎県

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

#7

投稿記事 by dic » 8年前

静的メンバ変数にするということで

コード:

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

コード:

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

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

アバター
サウス
記事: 78
登録日時: 9年前
住所: 千葉
連絡を取る:

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

#8

投稿記事 by サウス » 8年前

> ちなみに今は代用としてシングルトンで実装しているのですが、使い方が適当ではない気がしてなりません。

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等グローバルで使いたい関数について

#9

投稿記事 by シャイニング生ごみ » 8年前

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

アバター
Dixq (管理人)
管理人
記事: 1659
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

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

#10

投稿記事 by Dixq (管理人) » 8年前

おや・・質問文の最後の2行を完全に見落としていたようです・・。
的を得ない回答をしてすみません。

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

シャイニング生ごみ

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

#11

投稿記事 by シャイニング生ごみ » 8年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る