クラスのメンバ変数をグローバル変数の様に使いたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
タケ

クラスのメンバ変数をグローバル変数の様に使いたい

#1

投稿記事 by タケ » 13年前

こんにちは、お世話になります。
VisualStudio2010、DXライブラリ使用という環境で開発しています。C++についての質問です。
(質問最後にコードを貼らせて頂きます)

現在、1フレーム事のループ中で動作させ、マウスの情報を取得する関数を作っています。
C++の勉強も兼ねようと思い、とりあえずクラスというものを使ってみようと、以下のようなコードを書いてみました。

このクラスでループ毎に更新されるメンバ変数(MouseInfo.PosXなど)は、他の関数に渡したりして利用するつもりです。(左クリックのフラグを判定用関数に渡す等)
しかし、メンバ変数はprivateで指定するとそのメンバ関数でのみ利用できるようで、外部からアクセスができません。

疑問なのですが、こういう場合はメンバ変数をpublicに指定してしまっていいのでしょうか。
それだと、クラスに指定する意味がない(=グローバル変数で良い)気がします。もともと、グローバル変数は良くないと言われてますし、あまり使いたくないのが正直な所なのですが…。

考えてみたのですが、「受け渡しのためにマウス情報を構造体で作って、そこにMouseInfo.xxxを渡すメンバ関数を用意すればいいのでは、でもそれならメンバ変数をpublicに指定してしまえばいいのでは、でもpublicのメンバ変数となると結局グローバル変数なのでは、グローバル変数は(以下略」と堂々巡りです(^^;

『クラスで定義したメンバ変数をクラス外でも使いたい』場合
1.クラスにする必要がないから構造体で作り直す
2.public変数にしてしまってOK
3.その他の対処
どれが当てはまるのでしょうか。
宜しくお願いします。

コード:

// ヘッダファイルの記述
class MouseInfo {			//*** マウス情報管理クラス ***
private:
	int		PosX;			// マウスX座標
	int		PosY;			// マウスY座標
	bool	LClickDown;		// 左クリックが押されているか
	bool	RClickDown;		// 右クリックが押されているか
	bool	LClick;			// 左クリックフラグ
	bool	RClick;			// 右クリックフラグ
public:
	MouseInfo();			// コンストラクタ
	void GetInfo();			// マウス情報取得関数
	void Draw();			// マウス情報描画関数
}


// cppファイルの記述
/*===================================================================
	MouseInfo Function	マウス情報管理クラス用関数
===================================================================*/
MouseInfo::MouseInfo() {
	LClick = 0;
	RClick = 0;
}
void MouseInfo::GetInfo() {
	// 座標情報取得
	GetMousePoint(&PosX, &PosY);

	// マウスの左クリック情報取得
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
		// 左クリックが押下された時
		if(LClickDown == 0) {
			// 前回左クリックを押下されていなければ入力受付
			LClick++;
		} else {
			// 前回左クリックを押下されているならば入力拒否
			LClick = 0;
		}
		LClickDown++;
	} else if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0) {
		// 左クリックが押下されていない場合
		LClick = 0;
		LClickDown = 0;
	}
	
	// マウスの右クリック情報取得
	if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0) {
		// 右クリックが押下された時
		if(RClickDown == 0) {
			// 前回右クリックを押下されていなければ入力受付
			RClick++;
		} else {
			// 前回右クリックを押下されているならば入力拒否
			RClick = 0;
		}
		RClickDown++;
	} else {
		// 右クリックが押下されていない場合
		RClick = 0;
		RClickDown = 0;
	}
}
void MouseInfo::Draw() {	
	DrawFormatString(0, 0, GetColor(255, 255, 255), L"LClick: %d", LClick);
	DrawFormatString(100, 0, GetColor(255, 255, 255), L"RClick: %d", RClick);
	DrawFormatString(0, 20, GetColor(255, 255, 255), L"PosX = %d", PosX);
	DrawFormatString(100, 20, GetColor(255,255,255), L"PosY = %d", PosY);
}


// メイン関数抜粋
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	FPSControl	FPS;
	MouseInfo	MouseInfo;
...
...

	// メインループ開始
	while(ProcessMessage() == 0) {
		FPS.Update();
		ClearDrawScreen();

		MouseInfo.GetInfo();
/*
ここでMouseInfo.LClickなどを他関数で利用したい。
*/

...
...
...

		// デバッグ用出力
		if(true) {
			FPS.Draw();
			MouseInfo.Draw();
			DrawFormatString(840, 20, GetColor(255,255,255), L"GlobalTimer: %d", GlobalTimer);
		}
		ScreenFlip();
		GlobalTimer++;
		FPS.Wait();
	}
	DxLib_End();
	return 0;
}
C++を触ってみたばかりですので、的外れな質問でしたら申し訳ありません。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: クラスのメンバ変数をグローバル変数の様に使いたい

#2

投稿記事 by h2so5 » 13年前

構造体でもいいですが、変数の書き換えができてしまうのが嫌な場合はメンバをprivateにして

コード:

int getPosX() const { return PosX; }
int getPosY() const { return PosY; }
...
のように取得用の関数を追加します
タケ さんが書きました: 疑問なのですが、こういう場合はメンバ変数をpublicに指定してしまっていいのでしょうか。
それだと、クラスに指定する意味がない(=グローバル変数で良い)気がします。もともと、グローバル変数は良くないと言われてますし、あまり使いたくないのが正直な所なのですが…。

考えてみたのですが、「受け渡しのためにマウス情報を構造体で作って、そこにMouseInfo.xxxを渡すメンバ関数を用意すればいいのでは、でもそれならメンバ変数をpublicに指定してしまえばいいのでは、でもpublicのメンバ変数となると結局グローバル変数なのでは、グローバル変数は(以下略」と堂々巡りです(^^;
MouseInfoのインスタンスがローカル変数なので、メンバをpublicにしてもグローバル変数と同じようにはなりません。
スコープとアクセス修飾子は別のものです。

説明を聞く限りではMouseInfoは入力データの受け渡しをするためのものなので、Drawメソッドは蛇足です。

タケ

Re: クラスのメンバ変数をグローバル変数の様に使いたい

#3

投稿記事 by タケ » 13年前

ご回答ありがとうございます。
受け渡し用関数を用意する事にします。

閉鎖

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