C++での分割コンパイル

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

C++での分割コンパイル

#1

投稿記事 by イマダニ » 10年前

いきなり題名とそれますが、自分の状況を知ってもらいたいので。
現在C++でAI制作を目標に勉強しています。
環境はDxライブラリとvc++2008です。

まずどんなAIかというと

コード:

//0が何も表示しない場所,1が地面,2がゴール
int MapData[20][40] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 2, 0 } ,//←ここの2まで行くAI
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,

	{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,

	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,//←ここら辺から
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
上記の二次元配列の2に向かうAI、経路探索というんでしょうか、そんな簡単そうな?AIです。

初めてのAIならこれくらいかなと思い、挑戦してます。

ですが、ダイクストラ法など経路探索解説してるサイトや本は今現在見てきた物は全てC++で解説をしてました。
なのでひとまずC++の知識を整えようと思い、C++のシューティングを作ったりしてるんですが、
分割コンパイルでのやりとりで止まりました。
今までは

コード:

void map_check(MAP *map,PLAYER *p)//引数に書く
{
	/* マップのあたり判定 */
	if(map->MapData[p->py/VTOP_CHIP_SIZEY][p->px/VTOP_CHIP_SIZEX]==0){
		p->px = p->oldx;
		p->py = p->oldy;
	}

}
構造体をヘッダファイルに書いて、以下のようにファイル間のやり取りをしてました。
ゲームプログラミングの館の”ゲームの設計と分割コンパイル(3)”で解説されていたやり方ですね。

ですが、C++の場合、クラスにまとめた変数をどう共有すればいいかわかりません。

マップのクラス、プレイヤーのクラスを作り、それぞれを描画する事は出来ましたが、
上記の様な両方のクラスの変数を必要とする、関数が作れません。

どういうやり方が理想なんでしょうか?アドバイスお願いします。

アバター
usao
記事: 1887
登録日時: 11年前

Re: C++での分割コンパイル

#2

投稿記事 by usao » 10年前

なんか話があまりタイトルと関係ないような気もしますが…

structがclassになっただけで書けない という状況から
protected privateのようなアクセス制限された変数を直接参照しようとされているのかな?と推測しますが,
仮にそれだけの話であれば,
SetterとかGetterとかいう単語について調べればよいでしょう.
(クラスのメンバ変数にアクセスする手段を設ける)



あと,目的の処理をどこに書くべきか?という話も別途あるような気がします.
たとえば,猫クラス と 食べ物クラス という2つのクラスがあったとして,
その2つのクラスの情報を必要とする操作(関数)である「猫が食べ物を食べる」をどこに書くのか?

コード:

void Cat::Eat( Food * pFood );  //猫のメンバ関数として
void Food::AteBy( Cat *pCat );  //食べ物クラスのメンバ関数として.(eatの過去形ってateだよな確か)
void Eat( Cat *pCat, Food *pFood );  //普通の関数として
のどれを書くだろうか?というような.

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C++での分割コンパイル

#3

投稿記事 by みけCAT » 10年前

オフトピック
usao さんが書きました:

コード:

void Food::AteBy( Cat *pCat );  //食べ物クラスのメンバ関数として.(eatの過去形ってateだよな確か)
食べ物の受身だから、過去分詞のeatenを使う方が適切じゃないかな…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: C++での分割コンパイル

#4

投稿記事 by usao » 10年前

オフトピック
おおう… なんで過去形… 完全に頭がどうかしてた模様.

イマダニ
記事: 145
登録日時: 11年前

Re: C++での分割コンパイル

#5

投稿記事 by イマダニ » 10年前

すいません。質問が意味不明でした……
usaoさんの言うとおり、privateとかのメンバにアクセスしたいほんとそれだけです。

コード:

ai.h

#ifndef DEF_AI_H
#define DEF_AI_H

class AI{
private:
	int img;
	double x,y,oldx,oldy;
private:
	void Move();
	void Draw();
public:
	AI();
	void All();
};

#endif

コード:

map.h

#ifndef DEF_MAP_H
#define DEF_MAP_H

class MAP{
private:
	int MapData[100][100];
private:
	void Draw();//描画
	void Check();
public:
	MAP();
	int Load();
	void ALL();
};

#endif
ai.hとmap.h、それぞれのヘッダファイルに書かれた上記のクラスのprivateメンバを
map.cppの以下の関数で

コード:

void MAP::Check(){
	if(MapData[(int)AIのx座標/VTOP_CHIP_SIZEY][(int)AIのy座標/VTOP_CHIP_SIZEX]==0){
		AIのx=AIのoldx;
		AIのy=AIのoldy;
	}
}
こんな感じで使いたいってだけです。

それでどんな方法がいいのかなって疑問が今回の質問です。

void MAP::Check(MAP *map,AI *ai){}

こうしちゃうのか

それとも他にC++だったらもっといいやり方があるよっていうのがあったら教えてください。

>>SetterとかGetter
早速調べてきます

イマダニ
記事: 145
登録日時: 11年前

Re: C++での分割コンパイル

#6

投稿記事 by イマダニ » 10年前

解決です。
usaoさん、みけcatさんありがとうございました。

閉鎖

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