ページ 11

クラスに引数を渡すとerror-typeと扱われる

Posted: 2016年6月04日(土) 22:35
by Iseuma14
龍神録の館を参考にC++でプログラムを作っております
龍神録の館13章(http://dixq.net/rp/13.html)の部分を今やっているのですが、
enemyクラスのメンバ関数にshotクラスを引数をして渡すとその関数に赤線が出ます
マウスを合わせると以下のエラーメッセージが表示されます

void enemy_t::Action(enemy_t*,<error-type>*) (宣言された 行29 ”enemy_t::Actionを宣言したヘッダファイル”)との互換性がありません

上の場所以外にも引数にshotクラスを渡しているところは同じエラーが表示されます
最初、ヘッダファイル関連だったのでプリコンパイル済みヘッダの中の順序を変えてみたりしたのですが解決せず困っています
以下コードを張ります 未完成のところはまだ作ってないだけです そういう仕様ではないです

コード:

//enemy.cpp
#include"pch.h"
#include<stdlib.h>
#include<math.h>

void enemy_t::Process(int *key){}
void enemy_t::Process(){}
void enemy_t::Load(){}

void enemy_t::Init(enemy_t *enemy,int temp)
{
	int i;
	for(i=0;i<ENEMY_MAX;i++)
	{
		enemy[i].x			= temp;
		enemy[i].y			= temp;
		enemy[i].flag		= false;
		enemy[i].vx			= temp;
		enemy[i].vy			= temp;
		enemy[i].count		= temp;
		enemy[i].img		= temp;
		enemy[i].pattern	= temp;
		enemy[i].muki		= temp;
		enemy[i].kind		= temp;
		enemy[i].hp			= temp;
		enemy[i].hp_max		= temp;
		enemy[i].speed		= temp;
		enemy[i].angle		= temp;
		enemy[i].bltime		= temp;
		enemy[i].blkind		= temp;
		enemy[i].blkind2	= temp;
		enemy[i].color		= temp;
		enemy[i].state		= temp;
		enemy[i].wtime		= temp;
		enemy[i].wait		= temp;
	}
}

void enemy_t::Load(enemy_t *enemy)
{
	int i;
	for(i=0;i<ENEMY_MAX;i++)
	{
		LoadDivGraph("img/enemy/0.png", 9 , 3 , 3 , 32 , 32 ,enemy[i].stock);
	}
}

void enemy_t::Enter(enemy_t *enemy,enemy_order_t *enemy_order,int stage_count)
{
	int i,j,t;
	for(t=0;t<ENEMY_MAX;t++)
	{
		if(enemy_order[t].count == stage_count)
		{
			if((i = Search(enemy)) != -1)
			{
				enemy[i].flag	= TRUE;
				enemy[i].count	= 0;
				enemy[i].pattern= enemy_order[t].pattern;
				enemy[i].muki	= 1;
				enemy[i].kind	= enemy_order[t].kind;
				enemy[i].x		= enemy_order[t].x;
				enemy[i].y		= enemy_order[t].y;
				enemy[i].speed	= enemy_order[t].speed;
				enemy[i].bltime	= enemy_order[t].bltime;
				enemy[i].blkind	= enemy_order[t].blkind;
				enemy[i].blkind2= enemy_order[t].blkind2;
				enemy[i].color	= enemy_order[t].color;
				enemy[i].wait	= enemy_order[t].wait;
				enemy[i].hp		= enemy_order[t].hp;
				enemy[i].hp_max	= enemy[i].hp;
				enemy[i].vx		= 0;
				enemy[i].vy		= 0;
				enemy[i].angle	= 0;
				for(j=0;j<6;j++)
				{
					enemy[i].item[j] = enemy_order[t].item_n[j];
				}
			}
		}
	}
}

void enemy_t::Draw(){}

void enemy_t::Draw(enemy_t *enemy)
{
	int i;
	for(i=0;i<ENEMY_MAX;i++)
	{
		if(enemy[i].flag == 1)
			DrawRotaGraph(enemy[i].x,enemy[i].y,1.0,0.0,enemy[i].stock[enemy[i].img],TRUE);
	}
}

void enemy_t::Action(enemy_t *enemy,shot_t *shot)
{
	int i;
	for(i=0;i<ENEMY_MAX;i++)
	{
		if(enemy[i].flag == 1)
		{
			Pattern(enemy,i);
			enemy[i].x += cos(enemy[i].angle) * enemy[i].speed;
			enemy[i].y += sin(enemy[i].angle) * enemy[i].speed;
			enemy[i].x += enemy[i].vx;
			enemy[i].y += enemy[i].vy;
			enemy[i].count++;
			enemy[i].img = enemy[i].muki*3 + (enemy[i].count%18) / 6;
			if(enemy[i].x > X_MAX + 50 || enemy[i].x <- 50 || enemy[i].y <- 25 || enemy[i].y > Y_MAX + 25)
				enemy[i].flag = 0;
		}
	}
}

int enemy_t::Search(enemy_t *enemy)
{
	int i;
	for(i=0;i<ENEMY_MAX;i++)
	{
		if(enemy[i].flag == 0)
			return i;
	}
	return -1;
}

void enemy_t::Pattern(enemy_t *enemy,int i)
{
	switch(enemy[i].pattern)
	{
		case 0:
			Pattern0(enemy,i);
			break;
		case 1:
			Pattern1(enemy,i);
			break;
		case 2:
			Pattern2(enemy,i);
			break;
		case 3:
			Pattern3(enemy,i);
			break;
		case 4:
			Pattern4(enemy,i);
			break;
		case 5:
			Pattern5(enemy,i);
			break;
		case 6:
			Pattern6(enemy,i);
			break;
		case 7:
			Pattern7(enemy,i);
			break;
		case 8:
			Pattern8(enemy,i);
			break;
		case 9:
			Pattern9(enemy,i);
			break;
	}
}

double enemy_t::Epointx()
{
	return this->x;
}

double enemy_t::Epointy()
{
	return this->y;
}

int enemy_t::Get_blkind()
{
	return this->blkind;
}

int enemy_t::Get_blkind2()
{
	return this->blkind2;
}

コード:

//enemy.h
#ifndef INCLUDE_ENEMY
#define INCLUDE_ENEMY
#include "pch.h"


class enemy_t : public mover,public draw,public load
{
private:

	int img;		//画像識別
	int stock[9];	//画像保管
	int pattern;	//行動パターン
	int muki;		//向き
	int kind;		//種類
	int hp;			//体力
	int hp_max;		//最大体力
	int item[6];	//アイテム
    double speed;	//スピード
	double angle;	//角度
    int bltime;		//弾幕開始時間
	int blkind;		//弾幕の種類
	int blkind2;	//弾幕の種類
	int color;		//色
	int state;		//状態
	int wtime;		//待ち時間
	int wait;		//停滞時間
public:
	void Init(enemy_t*,int);
	void Action(enemy_t*,shot_t*);
	void Enter(enemy_t*,enemy_order_t*,int);
	void Draw(enemy_t*);
	void Load(enemy_t*);
	void Srory(enemy_t*);
	int Search(enemy_t*);
	void Shot(shot_t*,enemy_t*,int);
	int Get_blkind();
	int Get_blkind2();
	double Epointx();
	double Epointy();
	void Pattern(enemy_t*,int);
	virtual void Load();
	virtual void Draw();
	virtual void Process();
	virtual void Process(int*);
	void Pattern0(enemy_t*,int);
	void Pattern1(enemy_t*,int);
	void Pattern2(enemy_t*,int);
	void Pattern3(enemy_t*,int);
	void Pattern4(enemy_t*,int);
	void Pattern5(enemy_t*,int);
	void Pattern6(enemy_t*,int);
	void Pattern7(enemy_t*,int);
	void Pattern8(enemy_t*,int);
	void Pattern9(enemy_t*,int);
	void Pattern10(enemy_t*,int);
};

#endif

コード:

//プリコンパイル済みヘッダ
#include"DxLib.h"
#include"define.h"
#include"stdC.h"
#include"shot.h"
#include"player.h"
#include"enemy.h"
#include"board.h"
#include"struct.h"

コード:

//shot.cpp
#include "pch.h"
#include<memory.h>
#include<math.h>

void shot_t::Init(shot_t *shot)
{
	memset(shot,0,sizeof(shot_t)*SHOT_MAX);
}

double shot_t::Aim(player *ch,enemy_t *enemy,shot_t *shot,int n)
{
	return atan2(ch->Ppointy() - enemy[shot[n].number].Epointy(),ch->Ppointx() - enemy[shot[n].number].Epointx());
}

int shot_t::Shot_search(shot_t* shot,int n)		//空いている弾を探す
{
	int i;
	for(i=0;i<SHOT_MAX;i++)
	{
		if(shot[n].bullet[i].BFlag() == FALSE)
			return i;
	}
	return -1;
}

void shot_t::Shot_main(shot_t *shot)
{
	int i;
	for(i=0;i<SHOT_MAX;i++)
	{
		if(shot[i].SFlag() != 0)
		{

		}
	}
}

void shot_t::Shot_enter(enemy_t *enemy,shot_t *shot,int i)
{
	int j;
	for(j=0;j<SHOT_MAX;j++)
	{
	}
}

void shot_t::Shot_pattern(shot_t *shot,enemy_t *enemy,int n)
{
	switch(shot[n].kind)
	{
		case 0:
			shot[n].Number0(shot,enemy,n);
	}
}

void shot_t::Number0(shot_t *shot,enemy_t *enemy,int n)
{
	int j;
	if(shot[n].count == 0)
	{
		if(shot[n].flag != 2 && (j=shot[n].Shot_search(shot,n)) != -1)
		{
			//shot[n].kind = enemy[shot[n].number].blkind2;
		}
	}
}

コード:

//shot.h
#ifndef INCLUDE_SHOT
#define INCLUDE_SHOT
#include "pch.h"

class bullet_t
{
	private:
		bool flag;				//フラグ
		int kind;				//種類
		int count;				//カウント
		int color;				//色
		int state;				//状態
		int till;				//最低でも消えない時間
		int effect;				//エフェクトの種類
		double x,y;				//x座標,y座標
		double angle;			//角度
		double speed;			//スピード
		double base_angle[1];	//ベースの角度
		double rem_speed[1];	//一時保管スピード
		static int img_bullet[10][10];
	public:
		bool BFlag()
		{
			return this->flag;
		}
};

class shot_t
{
	private:
		bool flag;				//フラグ
		int kind;				//弾の種類
		int count;				//カウント
		int number;				//どの敵から出されたか
		double base_angle[1];	//ベースの角度
		double base_speed[1];	//ベースのスピード
		bullet_t bullet[SHOT_BULLET_MAX];
		int sound_se[SE_MAX];
		bool se_flag[SE_MAX];
	public:
		void Init(shot_t*);
		bool SFlag()
		{
			return this->flag;
		}
		double Aim(player*,enemy_t*,shot_t*,int);
		void Shot_main(shot_t*);
		void Shot_move(shot_t*,int);
		void Shot_enter(enemy_t*,shot_t*,int);
		int Shot_search(shot_t*,int);
		void Shot_pattern(shot_t*,enemy_t*,int n);
		void Number0(shot_t*,enemy_t*,int);
};

#endif
こんな感じです 長くて見づらいかもしれません 申し訳ないですがよろしくお願いします
また質問した以外にもおかしい場所があった場合指摘してもらえると嬉しいです

Re: クラスに引数を渡すとerror-typeと扱われる

Posted: 2016年6月05日(日) 18:52
by Iseuma14
自己解決しました
shot.hの中でpch.hをインクルードしており、そのpch.hの中にshot.hをインクルードしていたために挙動がおかしくなっていたようです
shot.hにインクルードするファイルをpch.hの中で必要なdefine.hのみをインクルードしたらerror-typeとはならずにshot_tとして認識されました
お目汚し失礼しました

Re: クラスに引数を渡すとerror-typeと扱われる

Posted: 2016年6月05日(日) 21:21
by Iseuma14
何度も失礼します
先ほどのものだけでは解決せず、もう一度見てみたところ
ヘッダファイル同士で循環参照していたことが原因でした
enemyヘッダにインクルードをせず、
class shot_t;と書いたところ、上手くいきました
何度も失礼しました