C++での異なるcppファイルでの情報の受け渡し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
air
記事: 10
登録日時: 10年前

C++での異なるcppファイルでの情報の受け渡し

#1

投稿記事 by air » 10年前

※慣れていないのでテンプレをコピペして使用してます
[1] 質問文
 [1.1] 自分が今行いたい事は何か
   →C++(dxlib)で、ヘッダーやcppファイルで取得した情報を他のcppファイルで参照?して使いたい
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
   →やりたいことの一部としてマウスの位置情報の受け渡しをしたく、いろいろと試しているのですが上手くいきません。

↓いまのmouse.hの中身です

コード:

#pragma once

#include "BaseScene.h"

class Mouse : public BaseScene {

private:
    int MouseX, MouseY; // マウスの位置情報を格納する
    int MouseCondition; // マウスの入力状態取得

public:
    Mouse(ISceneChanger* changer);
    void Initialize() override; // 初期化処理をオーバーライド
    void Update() override; // 更新処理をオーバーライド
    void Draw() override;   // 描画処理をオーバーライド

    void SetMouseX(int MouseX)
    {
        this->MouseX = MouseX;
    }
    void SetMouseY(int MouseY)
    {
        this->MouseY = MouseY;
    }

    int GetMouseX(int coordinateX)
    {
        coordinateX = this->MouseX;
        return coordinateX;
    }
    int GetMouseY(int coordinateY)
    {
        coordinateY = this->MouseY;
        return coordinateY;
    }
};
↓いまのmouse.cppの中身です

コード:

#include "DxLib.h"
#include "mouse.h"

// 初期化
void Mouse::Initialize(){
    MouseCondition = GetMouseInput();  //マウスの入力状態取得
}

// 更新
void Mouse::Update(){
    GetMousePoint(&MouseX, &MouseY);// マウスの位置情報を格納する

    SetMouseX(MouseX);
    SetMouseY(MouseY);
}
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
   →mainのループで毎回更新をするのは分かるのですがどのように書けばいいのか分からない
↓いまのmain.cppです

コード:

#include "DxLib.h"
#include "SceneMgr.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
    SetMainWindowText("title");    // タイトルをtitleに変更
    SetGraphMode(1280, 720, 32);  //ウィンドウのサイズ
    SetMouseDispFlag(FALSE);      // マウスを非表示状態にする

    SceneMgr sceneMgr;
    sceneMgr.Initialize();

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){//画面更新 & メッセージ処理 & 画面消去

        sceneMgr.Update();  //更新
        sceneMgr.Draw();    //描画
    }

    sceneMgr.Finalize();

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}
 [1.4] 今何がわからないのか、知りたいのか
   →まず、mouseのヘッダーとcppファイルの書き方はこの書き方でいいのか、
    mainではどのように書いて更新をするのか、
    使いたいcppファイルではどのように書けばいいのか  が知りたい内容です。

[2] 環境  
 [2.1] OS : Windows7
 [2.2] コンパイラ名 : VC++

[3] その他
 ・どの程度C言語を理解しているか
   →1年程度学習している
 ・ライブラリを使っている場合は何を使っているか
   →DXライブラリ

 ・このプログラムは「新・C言語 ~ゲームプログラミングの館~[DXライブラリ]」というサイトの「メニュー画面の作り方  sp.6」を参考に書いています。
新・C言語 ~ゲームプログラミングの館~[DXライブラリ] → http://dixq.net/g/

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++での異なるcppファイルでの情報の受け渡し

#2

投稿記事 by softya(ソフト屋) » 10年前

まず確認したいのは、C言語で書きたいのか現状書かれているC++で行くのかです。
もしかすると、ちゃんと言語の違いを区別されていないのでは?という不安が生じています。
C++であれば、クラスやらインスタンスやら色々と理解していただく必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

air
記事: 10
登録日時: 10年前

Re: C++での異なるcppファイルでの情報の受け渡し

#3

投稿記事 by air » 10年前

softya(ソフト屋) さんが書きました:まず確認したいのは、C言語で書きたいのか現状書かれているC++で行くのかです。
もしかすると、ちゃんと言語の違いを区別されていないのでは?という不安が生じています。
C++であれば、クラスやらインスタンスやら色々と理解していただく必要があります。
softya(ソフト屋)"さん、返信ありがとうございます。
正直いまいちCとC++の違いが分かっていませんでした。
c++を理解するために本やネットで違いなど勉強してきます

でも、私事ですがすぐにやり方を知りたい状況なので正直に書くとコードがほしいという気持ちも有ります

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++での異なるcppファイルでの情報の受け渡し

#4

投稿記事 by softya(ソフト屋) » 10年前

であればC++の選択は間違った選択肢です。C言語の数倍から数十倍の時間の勉強が必要です。
C言語であれば、ファイル分割をやめて関数にしてmainから呼び出せば直ぐに解決できる事だと思われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: C++での異なるcppファイルでの情報の受け渡し

#5

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

Mouseはシーンではないので、Baseシーンクラスから継承する必要はないと思います。
特にそれを活かしたmainの構造にもなっていないようですし。
私ならマウスは通常一つしかないので、シングルトンパターンで作ります。

シングルトンの使い方についてはゲームプログラミングの館で紹介していますので参考にしてください。
http://dixq.net/g/
sp.1, sp.2

> 私事ですがすぐにやり方を知りたい状況なので正直に書くとコードがほしいという気持ちも有ります

では私ならこう書くという方法をお伝えします。
プロジェクトソースコード一式を添付します。
http://dixq.net/BBS/zip/MouseSample.zip

main.cpp

コード:

#include "Lib/DxLib.h"
#include "Mouse.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	int white = GetColor(255,255,255), x, y;
	while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen() ){
		Mouse::GetInstance()->Update();
		x = Mouse::GetInstance()->GetX();
		y = Mouse::GetInstance()->GetY();
		DrawFormatString(0,0,white,"(%d,%d)",x,y);
	}
	DxLib_End();
	return 0;
}
Singleton.h

コード:

/***** Singleton.h *****/

#pragma once

template <typename _T>
class Singleton {

protected:
	Singleton() {}
	virtual ~Singleton() {}	
	Singleton(const Singleton& r){}
  	Singleton& operator=(const Singleton& r){}

public:
	static _T* GetInstance() {
		static _T inst;
		return &inst;
	};

};
Mouse.h

コード:

#pragma once

#include "Singleton.h"

class Mouse : public Singleton<Mouse> {

	int mX, mY;

public:
	Mouse();
	void Update();
	int GetX();
	int GetY();

};
Mouse.cpp

コード:

#include "Mouse.h"
#include "Lib/DxLib.h"

Mouse::Mouse() : 
	mX(0), 
	mY(0)
{
}

void Mouse::Update(){
	GetMousePoint(&mX, &mY);
}

int	Mouse::GetX(){
	return mX;
}

int Mouse::GetY(){
	return mY;
}
マウスクラスにある変数なのですから
int MouseX, MouseY;
のように、変数名にマウスと付ける必要は無いです。
また、メンバ変数にはmを先頭に付ける慣習があります。

air
記事: 10
登録日時: 10年前

Re: C++での異なるcppファイルでの情報の受け渡し

#6

投稿記事 by air » 10年前

softya(ソフト屋)さん、Dixq(管理人)さん返信ありがとうございます!
softya(ソフト屋) さんが書きました:であればC++の選択は間違った選択肢です。C言語の数倍から数十倍の時間の勉強が必要です。
C言語であれば、ファイル分割をやめて関数にしてmainから呼び出せば直ぐに解決できる事だと思われます。
まずsoftya(ソフト屋)さん、確かにC++に対する理解が浅く狭かった事は自覚していますので自分はC言語で作るのではなく、C++をC言語の数倍から数十倍の時間の勉強をしようと思います。
Dixq (管理人) さんが書きました:Mouseはシーンではないので、Baseシーンクラスから継承する必要はないと思います。
特にそれを活かしたmainの構造にもなっていないようですし。
私ならマウスは通常一つしかないので、シングルトンパターンで作ります。

シングルトンの使い方についてはゲームプログラミングの館で紹介していますので参考にしてください。
http://dixq.net/g/
sp.1, sp.2

> 私事ですがすぐにやり方を知りたい状況なので正直に書くとコードがほしいという気持ちも有ります

では私ならこう書くという方法をお伝えします。
Dixq (管理人)さん、参考サイトを良く見ていれば分かる問題にも関わらず丁寧な返答をしてくださりありがとうございます!
ソースコードまで付けていただきとても助かります
さっそく仕組みを理解して実装してみます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++での異なるcppファイルでの情報の受け渡し

#7

投稿記事 by softya(ソフト屋) » 10年前

それでは、慌てないと言うことで良いんでしょうか。場合によっては何ヶ月もかかりかねないです。
まぁ、Dixqさんのコードをそのまま使うだけなら、そうでもないですが。
なお、クラスで実装するならインスタンスを必ず理解してくださいね。
シングルトンの場合、インスタンスはかなり特殊です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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