クラスのメンバ変数をグローバル変数の様に使いたい
Posted: 2012年11月23日(金) 05:24
こんにちは、お世話になります。
VisualStudio2010、DXライブラリ使用という環境で開発しています。C++についての質問です。
(質問最後にコードを貼らせて頂きます)
現在、1フレーム事のループ中で動作させ、マウスの情報を取得する関数を作っています。
C++の勉強も兼ねようと思い、とりあえずクラスというものを使ってみようと、以下のようなコードを書いてみました。
このクラスでループ毎に更新されるメンバ変数(MouseInfo.PosXなど)は、他の関数に渡したりして利用するつもりです。(左クリックのフラグを判定用関数に渡す等)
しかし、メンバ変数はprivateで指定するとそのメンバ関数でのみ利用できるようで、外部からアクセスができません。
疑問なのですが、こういう場合はメンバ変数をpublicに指定してしまっていいのでしょうか。
それだと、クラスに指定する意味がない(=グローバル変数で良い)気がします。もともと、グローバル変数は良くないと言われてますし、あまり使いたくないのが正直な所なのですが…。
考えてみたのですが、「受け渡しのためにマウス情報を構造体で作って、そこにMouseInfo.xxxを渡すメンバ関数を用意すればいいのでは、でもそれならメンバ変数をpublicに指定してしまえばいいのでは、でもpublicのメンバ変数となると結局グローバル変数なのでは、グローバル変数は(以下略」と堂々巡りです(^^;
『クラスで定義したメンバ変数をクラス外でも使いたい』場合
1.クラスにする必要がないから構造体で作り直す
2.public変数にしてしまってOK
3.その他の対処
どれが当てはまるのでしょうか。
宜しくお願いします。
C++を触ってみたばかりですので、的外れな質問でしたら申し訳ありません。
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;
}